| Index: pkg/analysis_server/lib/src/server/driver.dart
 | 
| diff --git a/pkg/analysis_server/lib/src/server/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
 | 
| index 182bb18dd378943f4a7c720a739cc67f9e09c7b9..7f63419006fd6e2ea79544967aa2cd78c2c91aa1 100644
 | 
| --- a/pkg/analysis_server/lib/src/server/driver.dart
 | 
| +++ b/pkg/analysis_server/lib/src/server/driver.dart
 | 
| @@ -25,6 +25,8 @@ import 'package:args/args.dart';
 | 
|  import 'package:linter/src/rules.dart' as linter;
 | 
|  import 'package:plugin/manager.dart';
 | 
|  import 'package:plugin/plugin.dart';
 | 
| +import 'package:telemetry/crash_reporting.dart';
 | 
| +import 'package:telemetry/telemetry.dart' as telemetry;
 | 
|  
 | 
|  /// Commandline argument parser. (Copied from analyzer/lib/options.dart)
 | 
|  /// TODO(pquitslund): replaces with a simple [ArgParser] instance
 | 
| @@ -125,6 +127,10 @@ class CommandLineParser {
 | 
|          String arg = args[i];
 | 
|          if (arg.startsWith('--') && arg.length > 2) {
 | 
|            String option = arg.substring(2);
 | 
| +          // remove any leading 'no-'
 | 
| +          if (option.startsWith('no-')) {
 | 
| +            option = option.substring(3);
 | 
| +          }
 | 
|            // strip the last '=value'
 | 
|            int equalsOffset = option.lastIndexOf('=');
 | 
|            if (equalsOffset != -1) {
 | 
| @@ -195,6 +201,16 @@ class Driver implements ServerStarter {
 | 
|    static const String HELP_OPTION = "help";
 | 
|  
 | 
|    /**
 | 
| +   * The name of the flag used to configure reporting analytics.
 | 
| +   */
 | 
| +  static const String ANALYTICS_FLAG = "analytics";
 | 
| +
 | 
| +  /**
 | 
| +   * Suppress analytics for this session.
 | 
| +   */
 | 
| +  static const String SUPPRESS_ANALYTICS_FLAG = "suppress-analytics";
 | 
| +
 | 
| +  /**
 | 
|     * The name of the option used to cause instrumentation to also be written to
 | 
|     * a local file.
 | 
|     */
 | 
| @@ -232,8 +248,6 @@ class Driver implements ServerStarter {
 | 
|  
 | 
|    /**
 | 
|     * The path to the SDK.
 | 
| -   * TODO(paulberry): get rid of this once the 'analysis.updateSdks' request is
 | 
| -   * operational.
 | 
|     */
 | 
|    static const String SDK_OPTION = "sdk";
 | 
|  
 | 
| @@ -284,8 +298,43 @@ class Driver implements ServerStarter {
 | 
|    AnalysisServer start(List<String> arguments) {
 | 
|      CommandLineParser parser = _createArgParser();
 | 
|      ArgResults results = parser.parse(arguments, <String, String>{});
 | 
| +
 | 
| +    AnalysisServerOptions analysisServerOptions = new AnalysisServerOptions();
 | 
| +    analysisServerOptions.useAnalysisHighlight2 =
 | 
| +        results[USE_ANALYSIS_HIGHLIGHT2];
 | 
| +    analysisServerOptions.fileReadMode = results[FILE_READ_MODE];
 | 
| +    analysisServerOptions.newAnalysisDriverLog =
 | 
| +        results[NEW_ANALYSIS_DRIVER_LOG];
 | 
| +    analysisServerOptions.clientId = results[CLIENT_ID];
 | 
| +    analysisServerOptions.clientVersion = results[CLIENT_VERSION];
 | 
| +    analysisServerOptions.enableVerboseFlutterCompletions =
 | 
| +        results[VERBOSE_FLUTTER_COMPLETIONS];
 | 
| +
 | 
| +    telemetry.Analytics analytics = telemetry.createAnalyticsInstance(
 | 
| +        'UA-26406144-29', 'analysis-server',
 | 
| +        disableForSession: results[SUPPRESS_ANALYTICS_FLAG]);
 | 
| +    analysisServerOptions.analytics = analytics;
 | 
| +
 | 
| +    if (analysisServerOptions.clientId != null) {
 | 
| +      // Record the client name as the application installer ID.
 | 
| +      analytics.setSessionValue('aiid', analysisServerOptions.clientId);
 | 
| +    }
 | 
| +    if (analysisServerOptions.clientVersion != null) {
 | 
| +      analytics.setSessionValue('cd1', analysisServerOptions.clientVersion);
 | 
| +    }
 | 
| +
 | 
| +    // TODO(devoncarew): Replace with the real crash product ID.
 | 
| +    analysisServerOptions.crashReportSender =
 | 
| +        new CrashReportSender('Dart_analysis_server', analytics);
 | 
| +
 | 
| +    if (results.wasParsed(ANALYTICS_FLAG)) {
 | 
| +      analytics.enabled = results[ANALYTICS_FLAG];
 | 
| +      print(telemetry.createAnalyticsStatusMessage(analytics.enabled));
 | 
| +      return null;
 | 
| +    }
 | 
| +
 | 
|      if (results[HELP_OPTION]) {
 | 
| -      _printUsage(parser.parser);
 | 
| +      _printUsage(parser.parser, analytics, fromHelp: true);
 | 
|        return null;
 | 
|      }
 | 
|  
 | 
| @@ -298,25 +347,12 @@ class Driver implements ServerStarter {
 | 
|        } on FormatException {
 | 
|          print('Invalid port number: ${results[PORT_OPTION]}');
 | 
|          print('');
 | 
| -        _printUsage(parser.parser);
 | 
| +        _printUsage(parser.parser, analytics);
 | 
|          exitCode = 1;
 | 
|          return null;
 | 
|        }
 | 
|      }
 | 
|  
 | 
| -    AnalysisServerOptions analysisServerOptions = new AnalysisServerOptions();
 | 
| -    analysisServerOptions.useAnalysisHighlight2 =
 | 
| -        results[USE_ANALYSIS_HIGHLIGHT2];
 | 
| -    analysisServerOptions.fileReadMode = results[FILE_READ_MODE];
 | 
| -    analysisServerOptions.newAnalysisDriverLog =
 | 
| -        results[NEW_ANALYSIS_DRIVER_LOG];
 | 
| -
 | 
| -    analysisServerOptions.clientId = results[CLIENT_ID];
 | 
| -    analysisServerOptions.clientVersion = results[CLIENT_VERSION];
 | 
| -
 | 
| -    analysisServerOptions.enableVerboseFlutterCompletions =
 | 
| -        results[VERBOSE_FLUTTER_COMPLETIONS];
 | 
| -
 | 
|      //
 | 
|      // Process all of the plugins so that extensions are registered.
 | 
|      //
 | 
| @@ -361,14 +397,17 @@ class Driver implements ServerStarter {
 | 
|          new InstrumentationService(instrumentationServer);
 | 
|      instrumentationService.logVersion(
 | 
|          _readUuid(instrumentationService),
 | 
| -        results[CLIENT_ID],
 | 
| -        results[CLIENT_VERSION],
 | 
| +        analysisServerOptions.clientId,
 | 
| +        analysisServerOptions.clientVersion,
 | 
|          AnalysisServer.VERSION,
 | 
|          defaultSdk.sdkVersion);
 | 
|      AnalysisEngine.instance.instrumentationService = instrumentationService;
 | 
|  
 | 
|      _DiagnosticServerImpl diagnosticServer = new _DiagnosticServerImpl();
 | 
|  
 | 
| +    // Ping analytics with our initial call.
 | 
| +    analytics.sendScreenView('home');
 | 
| +
 | 
|      //
 | 
|      // Create the sockets and start listening for requests.
 | 
|      //
 | 
| @@ -452,8 +491,7 @@ class Driver implements ServerStarter {
 | 
|          defaultsTo: false,
 | 
|          negatable: false);
 | 
|      parser.addOption(INSTRUMENTATION_LOG_FILE,
 | 
| -        help:
 | 
| -            "the path of the file to which instrumentation data will be written");
 | 
| +        help: "write instrumentation data to the given file");
 | 
|      parser.addFlag(INTERNAL_PRINT_TO_CONSOLE,
 | 
|          help: "enable sending `print` output to the console",
 | 
|          defaultsTo: false,
 | 
| @@ -462,6 +500,10 @@ class Driver implements ServerStarter {
 | 
|          help: "set a destination for the new analysis driver's log");
 | 
|      parser.addFlag(VERBOSE_FLUTTER_COMPLETIONS,
 | 
|          help: "enable verbose code completion for Flutter (experimental)");
 | 
| +    parser.addFlag(ANALYTICS_FLAG,
 | 
| +        help: 'enable or disable sending analytics information to Google');
 | 
| +    parser.addFlag(SUPPRESS_ANALYTICS_FLAG,
 | 
| +        negatable: false, help: 'suppress analytics for this session');
 | 
|      parser.addOption(PORT_OPTION,
 | 
|          help: "the http diagnostic port on which the server provides"
 | 
|              " status and performance information");
 | 
| @@ -497,11 +539,21 @@ class Driver implements ServerStarter {
 | 
|    /**
 | 
|     * Print information about how to use the server.
 | 
|     */
 | 
| -  void _printUsage(ArgParser parser) {
 | 
| +  void _printUsage(ArgParser parser, telemetry.Analytics analytics,
 | 
| +      {bool fromHelp: false}) {
 | 
|      print('Usage: $BINARY_NAME [flags]');
 | 
|      print('');
 | 
|      print('Supported flags are:');
 | 
|      print(parser.usage);
 | 
| +
 | 
| +    // Print analytics status and information.
 | 
| +    if (fromHelp) {
 | 
| +      print('');
 | 
| +      print(telemetry.analyticsNotice);
 | 
| +    }
 | 
| +    print('');
 | 
| +    print(telemetry.createAnalyticsStatusMessage(analytics.enabled,
 | 
| +        command: ANALYTICS_FLAG));
 | 
|    }
 | 
|  
 | 
|    /**
 | 
| 
 |