Community implementation of native bindings for Datadog's SDK. This is not an official package.
- Generate a client token from Datadog through the Settings > API panel (under Client Tokens).
- Initialize:
await DatadogFlutter.initialize( clientToken: myDatadogClientToken, serviceName: 'my-app-name', environment: 'production', )
- Associate RUM and log events (optional):
await DatadogFlutter.setUserInfo(id: <YOUR_USER_ID>);
use_frameworks!
(Flutter includes this by default) and your minimum iOS target must be >= 11. This is a requirement from the Datadog SDK.
In its default implementation, log data will only be transmitted to Datadog through Logger
records. print
statements are not guaranteed to be captured.
ddLogger = DatadogLogger(loggerName: 'orders');
// optionally set a value for HOST
// ddLogger.addAttribute('hostname', <DEVICE IDENTIFIER>);
ddLogger.addTag('restaurant_type', 'pizza');
ddLogger.removeTag('restaurant_type');
// add attribute to every log
ddLogger.addAttribute('toppings', 'extra_cheese');
// add atttributes to some logs
ddLogger.log('time to cook pizza', Level.FINE, attributes: {
'durationInMilliseconds': timer.elapsedMilliseconds,
});
RUM adds support for error, event, and screen tracking. The integration requires additional configuration for each service.
- Supply an application ID to
initialize
:await DatadogFlutter.initialize( clientToken: myDatadogClientToken, serviceName: 'my-app-name', environment: 'production', iosRumApplicationId: myiOSRumApplicationId, androidRumApplicationId: myAndroidRumApplicationId, )
- Acknowledge
TrackingConsent
at initialization or later within your application. Events will not be logged untiltrackingConsent
is.granted
. This value can be updated viaDatadogFlutter.updateTrackingConsent
. - Automatically track screens:
MaterialApp( // ...your material config... home: HomeScreen(), navigatorObservers: [ DatadogObserver(), ], );
- Automatically report errors:
void main() async { // Capture Flutter errors automatically: FlutterError.onError = DatadogRum.instance.addFlutterError; // Catch errors without crashing the app: runZonedGuarded(() { runApp(MyApp()); }, (error, stackTrace) { DatadogRum.instance.addError(error, stackTrace); }); }
- Manually track additional events:
GestureDetector(onTap: () { DatadogRum.instance.addUserAction('EventTapped'); })
- Manually track additional errors:
try { throw StateError(); } catch (e, st) { DatadogRum.instance.addError(e, st); }
- Manually track network requests or resources:
await DatadogRum.startResourceLoading( aUniqueIdentifier, url: 'https://example.com', method: RUMResources.get, ); await DatadogRum.stopResourceLoading( aUniqueIdentifier, statusCode: 500, errorMessage: 'Internal Server Error' , )
Associate your HTTP requests with your backend service. Be sure to setup (usually immediately after DatadogFlutter.initialize
):
await DatadogTracing.initialize();
For one-off requests, instantiate a fresh client:
final httpClient = DatadogTracingHttpClient();
// make requests
final response = await httpClient.get('http://example.com');
For frameworks that use an internal client like Brick or Dio, compose the client:
RestProvider(
client: DatadogTracingHttpClient();
)
// or compose if another client is already being used:
RestProvider(
client: DatadogTracingHttpClient(GZipHttpClient());
)
By default, the DatadogFlutter
default constructor will send all logs from Logger
to Datadog. To ignore, set bindOnRecord
:
DatadogLogger(bindOnRecord: false)
And log conditionally later:
Logger.root.onRecord.listen((record) async {
if (shouldSendToDatadog) {
ddLogger.onRecordCallback(record)
} else {
print(record);
}
});