public static void Main(string[] args) { // Setup configuration to either read from the appsettings.json file (if present) or environment variables. var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddEnvironmentVariables(); _configuration = builder.Build(); var arguments = ParseArguments(); var cosmosDbConnectionString = new CosmosDbConnectionString(arguments.CosmosDbConnectionString); // Set an optional timeout for the generator. var cancellationSource = arguments.MillisecondsToRun == 0 ? new CancellationTokenSource() : new CancellationTokenSource(arguments.MillisecondsToRun); var cancellationToken = cancellationSource.Token; var statistics = new Statistic[0]; // Set the Cosmos DB connection policy. var connectionPolicy = new ConnectionPolicy { ConnectionMode = ConnectionMode.Direct, ConnectionProtocol = Protocol.Tcp, UseMultipleWriteLocations = true }; var numberOfMillisecondsToLead = arguments.MillisecondsToLead; var taskWaitTime = 0; if (numberOfMillisecondsToLead > 0) { taskWaitTime = numberOfMillisecondsToLead; } var progress = new Progress <Progress>(); progress.ProgressChanged += (sender, progressArgs) => { foreach (var message in progressArgs.Messages) { WriteLineInColor(message.Message, message.Color.ToConsoleColor()); } statistics = progressArgs.Statistics; }; WriteLineInColor("Vehicle Telemetry Generator", ConsoleColor.White); Console.WriteLine("======"); WriteLineInColor("Press Ctrl+C or Ctrl+Break to cancel.", ConsoleColor.Cyan); Console.WriteLine("Statistics for generated vehicle telemetry data will be updated for every 500 sent"); Console.WriteLine(string.Empty); ThreadPool.SetMinThreads(100, 100); // Handle Control+C or Control+Break. Console.CancelKeyPress += (o, e) => { WriteLineInColor("Stopped generator. No more events are being sent.", ConsoleColor.Yellow); cancellationSource.Cancel(); // Allow the main thread to continue and exit... WaitHandle.Set(); OutputStatistics(statistics); }; // Initialize the telemetry generator: TelemetryGenerator.Init(); // Instantiate Cosmos DB client and start sending messages: using (_cosmosDbClient = new DocumentClient(cosmosDbConnectionString.ServiceEndpoint, cosmosDbConnectionString.AuthKey, connectionPolicy)) { InitializeCosmosDb().Wait(); // Find and output the collection details, including # of RU/s. var dataCollection = GetCollectionIfExists(DatabaseName, CollectionName); var offer = (OfferV2)_cosmosDbClient.CreateOfferQuery().Where(o => o.ResourceLink == dataCollection.SelfLink).AsEnumerable().FirstOrDefault(); if (offer != null) { var currentCollectionThroughput = offer.Content.OfferThroughput; WriteLineInColor($"Found collection `{CollectionName}` with {currentCollectionThroughput} RU/s ({currentCollectionThroughput} reads/second; {currentCollectionThroughput / 5} writes/second @ 1KB doc size)", ConsoleColor.Green); var estimatedCostPerMonth = 0.06 * offer.Content.OfferThroughput; var estimatedCostPerHour = estimatedCostPerMonth / (24 * 30); WriteLineInColor($"The collection will cost an estimated ${estimatedCostPerHour:0.00} per hour (${estimatedCostPerMonth:0.00} per month (per write region))", ConsoleColor.Green); } // Start sending data to Cosmos DB. SendData(100, taskWaitTime, cancellationToken, progress).Wait(); } cancellationSource.Cancel(); Console.WriteLine(); WriteLineInColor("Done sending generated vehicle telemetry data", ConsoleColor.Cyan); Console.WriteLine(); Console.WriteLine(); OutputStatistics(statistics); // Keep the console open. Console.ReadLine(); WaitHandle.WaitOne(); }
public static void Main(string[] args) { // Setup configuration to either read from the appsettings.json file (if present) or environment variables. var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddEnvironmentVariables(); _configuration = builder.Build(); var arguments = ParseArguments(); // Set an optional timeout for the generator. var cancellationSource = arguments.MillisecondsToRun == 0 ? new CancellationTokenSource() : new CancellationTokenSource(arguments.MillisecondsToRun); var cancellationToken = cancellationSource.Token; var statistics = new Statistic[0]; var numberOfMillisecondsToLead = arguments.MillisecondsToLead; var taskWaitTime = 0; if (numberOfMillisecondsToLead > 0) { taskWaitTime = numberOfMillisecondsToLead; } var progress = new Progress <Progress>(); progress.ProgressChanged += (sender, progressArgs) => { foreach (var message in progressArgs.Messages) { WriteLineInColor(message.Message, message.Color.ToConsoleColor()); } statistics = progressArgs.Statistics; }; WriteLineInColor("Vehicle Telemetry Generator", ConsoleColor.White); Console.WriteLine("======"); WriteLineInColor("Press Ctrl+C or Ctrl+Break to cancel.", ConsoleColor.Cyan); Console.WriteLine("Statistics for generated vehicle telemetry data will be updated for every 500 sent"); Console.WriteLine(string.Empty); ThreadPool.SetMinThreads(100, 100); // Handle Control+C or Control+Break. Console.CancelKeyPress += (o, e) => { WriteLineInColor("Stopped generator. No more events are being sent.", ConsoleColor.Yellow); cancellationSource.Cancel(); // Allow the main thread to continue and exit... WaitHandle.Set(); OutputStatistics(statistics); }; // Initialize the telemetry generator: TelemetryGenerator.Init(); // Create an Event Hub Client from a connection string, using the EventHubConnectionString value. var eventHubClient = EventHubClient.CreateFromConnectionString( arguments.EventHubConnectionString ); // Start sending data to Event Hub. SendData(100, eventHubClient, taskWaitTime, cancellationToken, progress).Wait(); cancellationSource.Cancel(); Console.WriteLine(); WriteLineInColor("Done sending generated vehicle telemetry data", ConsoleColor.Cyan); Console.WriteLine(); Console.WriteLine(); OutputStatistics(statistics); // Keep the console open. Console.ReadLine(); WaitHandle.WaitOne(); }