# telemetry

A library to facilitate reporting analytics and crash reports.

## Analytics

This library is designed to allow all Dart SDK tools to easily send analytics
information and crash reports. The tools share a common setting to configure
sending analytics data. To use this library for a specific tool:

```
import 'package:telemetry/telemetry.dart';
import 'package:usage/usage.dart';

main() async {
  final String myAppTrackingID = ...;
  final String myAppName = ...;

  Analytics analytics = createAnalyticsInstance(myAppTrackingID, myAppName);
  ...
  analytics.sendScreenView('home');
  ...
  await analytics.waitForLastPing();
}
```

The analytics object reads from the correct user configuration file
automatically without any additional configuration. Analytics will not be sent
if the user has opted-out.

## Crash reporting

To use the crash reporting functionality, import `crash_reporting.dart`, and
create a new `CrashReportSender` instance:

```dart
import 'package:telemetry/crash_reporting.dart';

main() {
  Analytics analytics = ...;
  CrashReportSender sender = new CrashReportSender(analytics);
  try {
    ...
  } catch (e, st) {
    sender.sendReport(e, st);
  }
}
```

Crash reports will only be sent if the cooresponding [Analytics] object is
configured to send analytics.
