using System.Diagnostics; using System.Diagnostics.Metrics; namespace Tiku.Infrastructure.Observability; public static class WorkerTelemetry { public const string MeterName = "Tiku.Worker"; private static readonly Meter Meter = new(MeterName, "1.0.0"); private static readonly Counter JobCounter = Meter.CreateCounter("tiku.worker.jobs"); private static readonly Histogram JobDuration = Meter.CreateHistogram("tiku.worker.job.duration", "ms"); private static readonly Counter ScanCounter = Meter.CreateCounter("tiku.asset.security_scans"); private static readonly Histogram ScanDuration = Meter.CreateHistogram("tiku.asset.security_scan.duration", "ms"); private static readonly Counter IterationCounter = Meter.CreateCounter("tiku.worker.iterations"); private static readonly Histogram IterationDuration = Meter.CreateHistogram("tiku.worker.iteration.duration", "ms"); private static readonly Counter JobLeaseRenewalCounter = Meter.CreateCounter("tiku.worker.job.lease_renewals"); public static void RecordJob(string jobType, string status, double elapsedMilliseconds) { var tags = new TagList { { "job.type", jobType }, { "job.status", status } }; JobCounter.Add(1, tags); JobDuration.Record(elapsedMilliseconds, tags); } public static void RecordScan(string status, double elapsedMilliseconds) { var tags = new TagList { { "scan.status", status } }; ScanCounter.Add(1, tags); ScanDuration.Record(elapsedMilliseconds, tags); } public static void RecordIteration(string processor, bool succeeded, double elapsedMilliseconds) { var tags = new TagList { { "worker.processor", processor }, { "worker.succeeded", succeeded } }; IterationCounter.Add(1, tags); IterationDuration.Record(elapsedMilliseconds, tags); } public static void RecordJobLeaseRenewal(string outcome) { JobLeaseRenewalCounter.Add(1, new TagList { { "job.lease.outcome", outcome } }); } }