Files
AFFiNE-Mirror/packages/backend/server/src/plugins/gcloud/metrics.ts
T

61 lines
1.8 KiB
TypeScript

import { MetricExporter } from '@google-cloud/opentelemetry-cloud-monitoring-exporter';
import { TraceExporter } from '@google-cloud/opentelemetry-cloud-trace-exporter';
import { GcpDetectorSync } from '@google-cloud/opentelemetry-resource-util';
import { Global, Injectable, Module, Provider } from '@nestjs/common';
import { getEnv } from '@opentelemetry/core';
import { Resource } from '@opentelemetry/resources';
import {
MetricReader,
PeriodicExportingMetricReader,
} from '@opentelemetry/sdk-metrics';
import { SpanExporter } from '@opentelemetry/sdk-trace-node';
import {
SEMRESATTRS_CONTAINER_NAME,
SEMRESATTRS_K8S_POD_NAME,
} from '@opentelemetry/semantic-conventions';
import { OpentelemetryOptionsFactory } from '../../base/metrics';
@Injectable()
export class GCloudOpentelemetryOptionsFactory extends OpentelemetryOptionsFactory {
override getResource(): Resource {
const env = getEnv();
return super
.getResource()
.merge(
new Resource({
[SEMRESATTRS_K8S_POD_NAME]: env.HOSTNAME,
[SEMRESATTRS_CONTAINER_NAME]: env.CONTAINER_NAME,
})
)
.merge(new GcpDetectorSync().detect());
}
override getMetricReader(): MetricReader {
return new PeriodicExportingMetricReader({
exportIntervalMillis: 30000,
exportTimeoutMillis: 10000,
exporter: new MetricExporter({
prefix: 'custom.googleapis.com',
}),
metricProducers: this.getMetricsProducers(),
});
}
override getSpanExporter(): SpanExporter {
return new TraceExporter();
}
}
const FactorProvider: Provider = {
provide: OpentelemetryOptionsFactory,
useClass: GCloudOpentelemetryOptionsFactory,
};
@Global()
@Module({
providers: [FactorProvider],
exports: [FactorProvider],
})
export class GCloudMetrics {}