Skip to content

Commit

Permalink
Merge pull request #3 from Azure-Samples/attribution2
Browse files Browse the repository at this point in the history
Co-author augmentation
  • Loading branch information
chgeuer authored Feb 7, 2023
2 parents c535000 + 0d8febf commit 7b1516b
Show file tree
Hide file tree
Showing 6 changed files with 268 additions and 268 deletions.
44 changes: 22 additions & 22 deletions src/Program.cs
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
using custom_metrics_emitter;

IHost host = Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
IConfiguration configuration = hostContext.Configuration;

if (!string.IsNullOrEmpty(configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"]))
{
services.AddApplicationInsightsTelemetryWorkerService();
}
services.AddHostedService<Worker>();
services.AddLogging(opt =>
{
opt.AddSimpleConsole(config => config.TimestampFormat = "[HH:mm:ss]");
});

})
.Build();

await host.RunAsync();
using custom_metrics_emitter;

IHost host = Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
IConfiguration configuration = hostContext.Configuration;

if (!string.IsNullOrEmpty(configuration["APPLICATIONINSIGHTS_CONNECTION_STRING"]))
{
services.AddApplicationInsightsTelemetryWorkerService();
}
services.AddHostedService<Worker>();
services.AddLogging(opt =>
{
opt.AddSimpleConsole(config => config.TimestampFormat = "[HH:mm:ss]");
});

})
.Build();

await host.RunAsync();

132 changes: 66 additions & 66 deletions src/Worker.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
namespace custom_metrics_emitter;

using Azure.Identity;

public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger = default!;
private readonly EmitterConfig _cfg = default!;
private readonly EventHubEmitter _ehEmitter = default!;

public Worker(ILogger<Worker> logger, IConfiguration configuration)
{
namespace custom_metrics_emitter;

using Azure.Identity;

public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger = default!;
private readonly EmitterConfig _cfg = default!;
private readonly EventHubEmitter _ehEmitter = default!;

public Worker(ILogger<Worker> logger, IConfiguration configuration)
{
try
{
_logger = logger;
Expand All @@ -32,59 +32,59 @@ public Worker(ILogger<Worker> logger, IConfiguration configuration)
: new DefaultAzureCredential(options: new() { ManagedIdentityClientId = _cfg.ManagedIdentityClientId });

_ehEmitter = new(_logger, _cfg, defaultCredential);
}
catch(Exception ex)
}
catch(Exception ex)
{
logger.LogError("{error}", ex.ToString());
}
}

protected override async Task ExecuteAsync(CancellationToken cancellationToken = default)
{
try
{
while (!cancellationToken.IsCancellationRequested)
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.UtcNow);
var res = await _ehEmitter.ReadFromBlobStorageAndPublishToAzureMonitorAsync(cancellationToken);

if (res.IsSuccessStatusCode)
{
_logger.LogInformation("Send Custom Metric end with status: {status}", res.StatusCode);
}
else
{
_logger.LogError("Error sending custom event with status: {status}", res.StatusCode);
}

await Task.Delay(_cfg.CustomMetricInterval, cancellationToken);
}
}
catch (Exception ex)
{
_logger.LogError("{error}", ex.ToString());
}
}
}

/// <summary>
/// A helper class to make configuration parsing more fluent.
/// </summary>
internal static class IConfigurationExtensions
{
internal static int GetIntOrDefault(this IConfiguration cfg, string name, int defaulT) =>
!string.IsNullOrEmpty(cfg.GetValue<string>(name)) && int.TryParse(cfg.GetValue<string>(name), out int value) ? value : defaulT;

internal static string Optional(this IConfiguration cfg, string name) =>
cfg.GetValue<string>(name) ?? string.Empty;

internal static string Require(this IConfiguration cfg, string name)
{
var val = cfg.Optional(name);
if (string.IsNullOrEmpty(val))
{
throw new ArgumentException($"Configuration error, missing key {name}", nameof(cfg));
}
return val;
}
}
}
}

protected override async Task ExecuteAsync(CancellationToken cancellationToken = default)
{
try
{
while (!cancellationToken.IsCancellationRequested)
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.UtcNow);
var res = await _ehEmitter.ReadFromBlobStorageAndPublishToAzureMonitorAsync(cancellationToken);

if (res.IsSuccessStatusCode)
{
_logger.LogInformation("Send Custom Metric end with status: {status}", res.StatusCode);
}
else
{
_logger.LogError("Error sending custom event with status: {status}", res.StatusCode);
}

await Task.Delay(_cfg.CustomMetricInterval, cancellationToken);
}
}
catch (Exception ex)
{
_logger.LogError("{error}", ex.ToString());
}
}
}

/// <summary>
/// A helper class to make configuration parsing more fluent.
/// </summary>
internal static class IConfigurationExtensions
{
internal static int GetIntOrDefault(this IConfiguration cfg, string name, int defaulT) =>
!string.IsNullOrEmpty(cfg.GetValue<string>(name)) && int.TryParse(cfg.GetValue<string>(name), out int value) ? value : defaulT;

internal static string Optional(this IConfiguration cfg, string name) =>
cfg.GetValue<string>(name) ?? string.Empty;

internal static string Require(this IConfiguration cfg, string name)
{
var val = cfg.Optional(name);
if (string.IsNullOrEmpty(val))
{
throw new ArgumentException($"Configuration error, missing key {name}", nameof(cfg));
}
return val;
}
}
26 changes: 13 additions & 13 deletions src/emitters/EmitterConfig.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
namespace custom_metrics_emitter;

public record EmitterConfig(
string Region,
string SubscriptionId,
string ResourceGroup,
string TenantId,
string EventHubNamespace,
string EventHubName,
string ConsumerGroup,
string CheckpointAccountName,
string CheckpointContainerName,
int CustomMetricInterval,
namespace custom_metrics_emitter;

public record EmitterConfig(
string Region,
string SubscriptionId,
string ResourceGroup,
string TenantId,
string EventHubNamespace,
string EventHubName,
string ConsumerGroup,
string CheckpointAccountName,
string CheckpointContainerName,
int CustomMetricInterval,
string ManagedIdentityClientId);
2 changes: 1 addition & 1 deletion src/emitters/EmitterHelper.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
namespace custom_metrics_emitter.emitters;
namespace custom_metrics_emitter.emitters;

using Azure.Core;
using Azure.Identity;
Expand Down
36 changes: 18 additions & 18 deletions src/emitters/EmitterSchema.cs
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
namespace custom_metrics_emitter.emitters;
namespace custom_metrics_emitter.emitters;

using System.Text.Json.Serialization;

// https://learn.microsoft.com/en-us/azure/azure-monitor/essentials/metrics-store-custom-rest-api

#pragma warning disable IDE1006 // Naming Styles

#pragma warning disable IDE1006 // Naming Styles

public record EmitterSchema(
DateTime time,
CustomMetricData? data);

public record CustomMetricData(
CustomMetricBaseData? baseData);

public record CustomMetricBaseData(
string? metric,
string? Namespace,
IEnumerable<string>? dimNames,
IEnumerable<CustomMetricBaseDataSeriesItem>? series);

public record CustomMetricBaseDataSeriesItem(
IEnumerable<string>? dimValues,
[property: JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] long? min,
[property: JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] long? max,
[property: JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] long? sum,
[property: JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] long? count);

#pragma warning restore IDE1006 // Naming Styles

public record CustomMetricBaseData(
string? metric,
string? Namespace,
IEnumerable<string>? dimNames,
IEnumerable<CustomMetricBaseDataSeriesItem>? series);

public record CustomMetricBaseDataSeriesItem(
IEnumerable<string>? dimValues,
[property: JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] long? min,
[property: JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] long? max,
[property: JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] long? sum,
[property: JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] long? count);

#pragma warning restore IDE1006 // Naming Styles
Loading

0 comments on commit 7b1516b

Please sign in to comment.