add guage

This commit is contained in:
Simon Larsen
2023-10-24 13:35:26 +01:00
parent 67447c0bd7
commit ee54a324d7
23 changed files with 352 additions and 9 deletions

View File

@@ -122,6 +122,7 @@ import LogService from './LogService';
import SpanService from './SpanService';
import MetricSumService from './MetricSumService';
import MetricHistogramService from './MetricHistogramService';
import MetricGaugeService from './MetricGaugeService';
const services: Array<BaseService> = [
PromoCodeService,
@@ -235,6 +236,6 @@ const services: Array<BaseService> = [
export const AnalyticsServices: Array<
AnalyticsDatabaseService<AnalyticsBaseModel>
> = [LogService, SpanService, MetricSumService, MetricHistogramService];
> = [LogService, SpanService, MetricSumService, MetricHistogramService, MetricGaugeService];
export default services;

View File

@@ -0,0 +1,11 @@
import MetricGauge from 'Model/AnalyticsModels/MetricGauge';
import AnalyticsDatabaseService from './AnalyticsDatabaseService';
import ClickhouseDatabase from '../Infrastructure/ClickhouseDatabase';
export class MetricGaugeService extends AnalyticsDatabaseService<MetricGauge> {
public constructor(clickhouseDatabase?: ClickhouseDatabase | undefined) {
super({ modelType: MetricGauge, database: clickhouseDatabase });
}
}
export default new MetricGaugeService();

View File

@@ -56,12 +56,17 @@ builder.Services.AddOpenTelemetry()
System.Console.WriteLine($"OTLP Exporter is using {opt.Protocol} protocol and endpoint {opt.Endpoint}");
}));
// Custom metrics for the application
var greeterMeter = new Meter("OtPrGrYa.Example");
// Metrics.
builder.Services.AddOpenTelemetry()
.ConfigureResource(resource => resource
.AddService(serviceName: builder.Environment.ApplicationName))
.WithMetrics(metrics => metrics
.AddAspNetCoreInstrumentation()
.AddMeter("OtPrGrYa.Example")
.AddConsoleExporter((exporterOptions, metricReaderOptions) =>
{
metricReaderOptions.PeriodicExportingMetricReaderOptions.ExportIntervalMilliseconds = 1000;
@@ -75,15 +80,29 @@ builder.Services.AddOpenTelemetry()
}
System.Console.WriteLine($"OTLP Exporter is using {opt.Protocol} protocol and endpoint {opt.Endpoint}");
}));
var app = builder.Build();
// Custom metrics for the application
var greeterMeter = new Meter("OtPrGrYa.Example", "1.0.0");
var value = 1;
int getGuage()
{
value++;
return value;
}
greeterMeter.CreateObservableGauge("ThreadCount", () => new[] { new Measurement<int>(ThreadPool.ThreadCount) });
var countGreetings = greeterMeter.CreateCounter<int>("greetings.count", description: "Counts the number of greetings");
// Custom ActivitySource for the application
var greeterActivitySource = new ActivitySource("OtPrGrJa.Example");

View File

@@ -11,7 +11,8 @@
"OpenTelemetry.Exporter.Console": "1.6.0",
"OpenTelemetry.Exporter.OpenTelemetryProtocol": "1.6.0",
"OpenTelemetry.Extensions.Hosting": "1.6.0",
"OpenTelemetry.Instrumentation.AspNetCore": "1.5.1-beta.1"
"OpenTelemetry.Instrumentation.AspNetCore": "1.5.1-beta.1",
"OpenTelemetry.Instrumentation.Runtime": "1.5.1"
},
"runtime": {
"otel-dotnet.dll": {}
@@ -207,6 +208,17 @@
}
}
},
"OpenTelemetry.Instrumentation.Runtime/1.5.1": {
"dependencies": {
"OpenTelemetry.Api": "1.6.0"
},
"runtime": {
"lib/net6.0/OpenTelemetry.Instrumentation.Runtime.dll": {
"assemblyVersion": "1.5.1.0",
"fileVersion": "1.5.1.0"
}
}
},
"System.Diagnostics.DiagnosticSource/7.0.2": {
"dependencies": {
"System.Runtime.CompilerServices.Unsafe": "6.0.0"
@@ -398,6 +410,13 @@
"path": "opentelemetry.instrumentation.aspnetcore/1.5.1-beta.1",
"hashPath": "opentelemetry.instrumentation.aspnetcore.1.5.1-beta.1.nupkg.sha512"
},
"OpenTelemetry.Instrumentation.Runtime/1.5.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-F3uYt/T5+2YZCxZmAdoK7u5AZxqDLYaTj5ddZ//Cnn9x+Lys9D9wRzqizQgKpAQJJ6prVh0TcBEbCCpEKKDZvw==",
"path": "opentelemetry.instrumentation.runtime/1.5.1",
"hashPath": "opentelemetry.instrumentation.runtime.1.5.1.nupkg.sha512"
},
"System.Diagnostics.DiagnosticSource/7.0.2": {
"type": "package",
"serviceable": true,

View File

@@ -1 +1 @@
02d49b3f532cf4a85b56dd95b3e5d85b0107dabb
dd731758440b2020b7f6d3116dc659916e251de0

View File

@@ -33,3 +33,4 @@
/Users/nawazdhandala/Projects/OneUptime/oneuptime/Examples/otel-dotnet/bin/Debug/net6.0/Grpc.Net.Client.dll
/Users/nawazdhandala/Projects/OneUptime/oneuptime/Examples/otel-dotnet/bin/Debug/net6.0/Grpc.Net.Common.dll
/Users/nawazdhandala/Projects/OneUptime/oneuptime/Examples/otel-dotnet/bin/Debug/net6.0/OpenTelemetry.Exporter.OpenTelemetryProtocol.dll
/Users/nawazdhandala/Projects/OneUptime/oneuptime/Examples/otel-dotnet/bin/Debug/net6.0/OpenTelemetry.Instrumentation.Runtime.dll

View File

@@ -53,6 +53,10 @@
"OpenTelemetry.Instrumentation.AspNetCore": {
"target": "Package",
"version": "[1.5.1-beta.1, )"
},
"OpenTelemetry.Instrumentation.Runtime": {
"target": "Package",
"version": "[1.5.1, )"
}
},
"imports": [

View File

@@ -300,6 +300,18 @@
"Microsoft.AspNetCore.App"
]
},
"OpenTelemetry.Instrumentation.Runtime/1.5.1": {
"type": "package",
"dependencies": {
"OpenTelemetry.Api": "[1.5.1, 2.0.0)"
},
"compile": {
"lib/net6.0/OpenTelemetry.Instrumentation.Runtime.dll": {}
},
"runtime": {
"lib/net6.0/OpenTelemetry.Instrumentation.Runtime.dll": {}
}
},
"System.Diagnostics.DiagnosticSource/7.0.2": {
"type": "package",
"dependencies": {
@@ -794,6 +806,24 @@
"opentelemetry.instrumentation.aspnetcore.nuspec"
]
},
"OpenTelemetry.Instrumentation.Runtime/1.5.1": {
"sha512": "F3uYt/T5+2YZCxZmAdoK7u5AZxqDLYaTj5ddZ//Cnn9x+Lys9D9wRzqizQgKpAQJJ6prVh0TcBEbCCpEKKDZvw==",
"type": "package",
"path": "opentelemetry.instrumentation.runtime/1.5.1",
"files": [
".nupkg.metadata",
".signature.p7s",
"lib/net462/OpenTelemetry.Instrumentation.Runtime.dll",
"lib/net462/OpenTelemetry.Instrumentation.Runtime.xml",
"lib/net6.0/OpenTelemetry.Instrumentation.Runtime.dll",
"lib/net6.0/OpenTelemetry.Instrumentation.Runtime.xml",
"lib/netstandard2.0/OpenTelemetry.Instrumentation.Runtime.dll",
"lib/netstandard2.0/OpenTelemetry.Instrumentation.Runtime.xml",
"opentelemetry-icon-color.png",
"opentelemetry.instrumentation.runtime.1.5.1.nupkg.sha512",
"opentelemetry.instrumentation.runtime.nuspec"
]
},
"System.Diagnostics.DiagnosticSource/7.0.2": {
"sha512": "hYr3I9N9811e0Bjf2WNwAGGyTuAFbbTgX1RPLt/3Wbm68x3IGcX5Cl75CMmgT6WlNwLQ2tCCWfqYPpypjaf2xA==",
"type": "package",
@@ -919,7 +949,8 @@
"OpenTelemetry.Exporter.Console >= 1.6.0",
"OpenTelemetry.Exporter.OpenTelemetryProtocol >= 1.6.0",
"OpenTelemetry.Extensions.Hosting >= 1.6.0",
"OpenTelemetry.Instrumentation.AspNetCore >= 1.5.1-beta.1"
"OpenTelemetry.Instrumentation.AspNetCore >= 1.5.1-beta.1",
"OpenTelemetry.Instrumentation.Runtime >= 1.5.1"
]
},
"packageFolders": {
@@ -974,6 +1005,10 @@
"OpenTelemetry.Instrumentation.AspNetCore": {
"target": "Package",
"version": "[1.5.1-beta.1, )"
},
"OpenTelemetry.Instrumentation.Runtime": {
"target": "Package",
"version": "[1.5.1, )"
}
},
"imports": [

View File

@@ -1,6 +1,6 @@
{
"version": 2,
"dgSpecHash": "q904JtYq1lLAiuvP7YZAtmR3LAs+M1o5PfyM0Qj3+rz7xX6AiTGIp6qCcuj7Ew3h5sJxnepofHEAg0S9PbQ4GA==",
"dgSpecHash": "kBspCkYM82GK1DjcaFAxuFSJ5yyZDweAwZpDY3NzeL+b5AIdlzzBhqF0w41aQvigzdX60YHSP8Nwd+epadb4vQ==",
"success": true,
"projectFilePath": "/Users/nawazdhandala/Projects/OneUptime/oneuptime/Examples/otel-dotnet/otel-dotnet.csproj",
"expectedPackageFiles": [
@@ -28,6 +28,7 @@
"/Users/nawazdhandala/.nuget/packages/opentelemetry.exporter.opentelemetryprotocol/1.6.0/opentelemetry.exporter.opentelemetryprotocol.1.6.0.nupkg.sha512",
"/Users/nawazdhandala/.nuget/packages/opentelemetry.extensions.hosting/1.6.0/opentelemetry.extensions.hosting.1.6.0.nupkg.sha512",
"/Users/nawazdhandala/.nuget/packages/opentelemetry.instrumentation.aspnetcore/1.5.1-beta.1/opentelemetry.instrumentation.aspnetcore.1.5.1-beta.1.nupkg.sha512",
"/Users/nawazdhandala/.nuget/packages/opentelemetry.instrumentation.runtime/1.5.1/opentelemetry.instrumentation.runtime.1.5.1.nupkg.sha512",
"/Users/nawazdhandala/.nuget/packages/system.diagnostics.diagnosticsource/7.0.2/system.diagnostics.diagnosticsource.7.0.2.nupkg.sha512",
"/Users/nawazdhandala/.nuget/packages/system.memory/4.5.3/system.memory.4.5.3.nupkg.sha512",
"/Users/nawazdhandala/.nuget/packages/system.runtime.compilerservices.unsafe/6.0.0/system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512",

View File

@@ -8,3 +8,10 @@
2.0
2.0
2.0
2.0
2.0
2.0
2.0
2.0
2.0
2.0

View File

@@ -12,6 +12,7 @@
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.6.0" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.6.0" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.5.1-beta.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.5.1" />
</ItemGroup>
</Project>

View File

@@ -14,7 +14,9 @@ import OneUptimeDate from 'Common/Types/Date';
import SpanService from 'CommonServer/Services/SpanService';
import MetricSumService from 'CommonServer/Services/MetricSumService';
import MetricHistogramService from 'CommonServer/Services/MetricHistogramService';
import MetricGaugeService from 'CommonServer/Services/MetricGaugeService';
import MetricSum from 'Model/AnalyticsModels/MetricSum';
import MetricGauge from 'Model/AnalyticsModels/MetricGauge';
import MetricHistogram from 'Model/AnalyticsModels/MetricHistogram';
import LogService from 'CommonServer/Services/LogService';
import ObjectID from 'Common/Types/ObjectID';
@@ -152,6 +154,7 @@ router.post(
const dbMetricsSum: Array<MetricSum> = [];
const dbMetricsHistogram: Array<MetricHistogram> = [];
const dbMetricsGauge: Array<MetricGauge> = [];
for (const resourceMetric of resourceMetrics) {
const scopeMetrics: JSONArray = resourceMetric[
@@ -217,9 +220,55 @@ router.post(
dbMetricsSum.push(dbMetricSum);
}
}
}else if (
metric['gauge'] &&
(metric['gauge'] as JSONObject)['dataPoints'] &&
(
(metric['gauge'] as JSONObject)[
'dataPoints'
] as JSONArray
).length > 0
) {
for (const datapoint of (
metric['gauge'] as JSONObject
)['dataPoints'] as JSONArray) {
const dbMetricGauge: MetricGauge = new MetricGauge();
if (
dbMetricGauge.projectId =
ObjectID.getZeroObjectID();
dbMetricGauge.serviceId =
ObjectID.getZeroObjectID();
dbMetricGauge.name = metricName;
dbMetricGauge.description = metricDescription;
dbMetricGauge.startTimeUnixNano = datapoint[
'startTimeUnixNano'
] as number;
dbMetricGauge.startTime =
OneUptimeDate.fromUnixNano(
datapoint['startTimeUnixNano'] as number
);
dbMetricGauge.timeUnixNano = datapoint[
'timeUnixNano'
] as number;
dbMetricGauge.time = OneUptimeDate.fromUnixNano(
datapoint['timeUnixNano'] as number
);
dbMetricGauge.value = datapoint[
'asInt'
] as number;
dbMetricGauge.attributes =
OTelIngestService.getKeyValues(
metric['attributes'] as JSONArray
);
dbMetricsGauge.push(dbMetricGauge);
}
} else if (
metric['histogram'] &&
(metric['histogram'] as JSONObject)['dataPoints'] &&
(
@@ -287,6 +336,8 @@ router.post(
dbMetricsHistogram.push(dbMetricHistogram);
}
}else{
logger.warn('Unknown metric type', metric);
}
}
}
@@ -307,6 +358,13 @@ router.post(
},
});
await MetricGaugeService.createMany({
items: dbMetricsGauge,
props: {
isRoot: true,
},
});
return Response.sendEmptyResponse(req, res);
} catch (err) {
return next(err);

View File

@@ -3,12 +3,14 @@ import AnalyticsBaseModel from 'Common/AnalyticsModels/BaseModel';
import Span from './Span';
import MetricHistogram from './MetricHistogram';
import MetricSum from './MetricSum';
import MetricGauge from './MetricGauge';
const AnalyticsModels: Array<typeof AnalyticsBaseModel> = [
Log,
Span,
MetricHistogram,
MetricSum,
MetricGauge,
];
export default AnalyticsModels;

View File

@@ -0,0 +1,184 @@
import AnalyticsBaseModel from 'Common/AnalyticsModels/BaseModel';
import AnalyticsTableColumn from 'Common/Types/AnalyticsDatabase/TableColumn';
import TableColumnType from 'Common/Types/AnalyticsDatabase/TableColumnType';
import AnalyticsTableEngine from 'Common/Types/AnalyticsDatabase/AnalyticsTableEngine';
import ObjectID from 'Common/Types/ObjectID';
import KeyValueNestedModel from './NestedModels/KeyValueNestedModel';
export default class Metric extends AnalyticsBaseModel {
public constructor() {
super({
tableName: 'MetricGauge',
tableEngine: AnalyticsTableEngine.MergeTree,
singularName: 'Metric Gauge',
pluralName: 'Metrics Gauge',
tableColumns: [
new AnalyticsTableColumn({
key: 'projectId',
title: 'Project ID',
description: 'ID of project',
required: true,
type: TableColumnType.ObjectID,
}),
new AnalyticsTableColumn({
key: 'serviceId',
title: 'Service ID',
description: 'ID of the Service which created the log',
required: true,
type: TableColumnType.ObjectID,
}),
// add name and description
new AnalyticsTableColumn({
key: 'name',
title: 'Name',
description: 'Name of the Metric',
required: false,
type: TableColumnType.Text,
}),
new AnalyticsTableColumn({
key: 'description',
title: 'Description',
description: 'Description of the Metric',
required: false,
type: TableColumnType.Text,
}),
new AnalyticsTableColumn({
key: 'time',
title: 'Time',
description: 'When did the Metric happen?',
required: true,
type: TableColumnType.Date,
}),
new AnalyticsTableColumn({
key: 'startTime',
title: 'Start Time',
description: 'When did the Metric happen?',
required: false,
type: TableColumnType.Date,
}),
new AnalyticsTableColumn({
key: 'timeUnixNano',
title: 'Time (in Unix Nano)',
description: 'When did the Metric happen?',
required: false,
type: TableColumnType.LongNumber,
}),
new AnalyticsTableColumn({
key: 'startTimeUnixNano',
title: 'Start Time (in Unix Nano)',
description: 'When did the Metric happen?',
required: true,
type: TableColumnType.LongNumber,
}),
new AnalyticsTableColumn({
key: 'attributes',
title: 'Attributes',
description: 'Attributes',
required: false,
type: TableColumnType.NestedModel,
nestedModel: new KeyValueNestedModel(),
}),
new AnalyticsTableColumn({
key: 'value',
title: 'Value',
description: 'Value',
required: false,
type: TableColumnType.Number,
}),
],
primaryKeys: ['projectId', 'serviceId', 'time'],
});
}
public get projectId(): ObjectID | undefined {
return this.getColumnValue('projectId') as ObjectID | undefined;
}
public set projectId(v: ObjectID | undefined) {
this.setColumnValue('projectId', v);
}
public get serviceId(): ObjectID | undefined {
return this.getColumnValue('serviceId') as ObjectID | undefined;
}
public set serviceId(v: ObjectID | undefined) {
this.setColumnValue('serviceId', v);
}
public get time(): Date | undefined {
return this.getColumnValue('time') as Date | undefined;
}
public set time(v: Date | undefined) {
this.setColumnValue('time', v);
}
public get name(): string | undefined {
return this.getColumnValue('name') as string | undefined;
}
public set name(v: string | undefined) {
this.setColumnValue('name', v);
}
public get description(): string | undefined {
return this.getColumnValue('description') as string | undefined;
}
public set description(v: string | undefined) {
this.setColumnValue('description', v);
}
public get attributes(): Array<KeyValueNestedModel> | undefined {
return this.getColumnValue('attributes') as
| Array<KeyValueNestedModel>
| undefined;
}
public set attributes(v: Array<KeyValueNestedModel> | undefined) {
this.setColumnValue('attributes', v);
}
public get value(): number | undefined {
return this.getColumnValue('value') as number | undefined;
}
public set value(v: number | undefined) {
this.setColumnValue('value', v);
}
public get startTime(): Date | undefined {
return this.getColumnValue('startTime') as Date | undefined;
}
public set startTime(v: Date | undefined) {
this.setColumnValue('startTime', v);
}
public get startTimeUnixNano(): number | undefined {
return this.getColumnValue('startTimeUnixNano') as number | undefined;
}
public set startTimeUnixNano(v: number | undefined) {
this.setColumnValue('startTimeUnixNano', v);
}
public get timeUnixNano(): number | undefined {
return this.getColumnValue('timeUnixNano') as number | undefined;
}
public set timeUnixNano(v: number | undefined) {
this.setColumnValue('timeUnixNano', v);
}
}