Revert "fix(server): wrong usage of optl (#6714)"

This reverts commit 4868f6e611.
This commit is contained in:
forehalo
2024-07-19 11:31:01 +08:00
parent 585003640f
commit 90c00b6db9
11 changed files with 70 additions and 182 deletions
@@ -3,13 +3,9 @@ import '../prelude';
import { Logger } from '@nestjs/common';
import { CommandFactory } from 'nest-commander';
import { registerInstrumentations } from '../fundamentals/metrics';
async function bootstrap() {
AFFiNE.metrics.enabled = false;
AFFiNE.doc.manager.enableUpdateAutoMerging = false;
registerInstrumentations();
const { CliAppModule } = await import('./app');
await CommandFactory.run(CliAppModule, new Logger()).catch(e => {
console.error(e);
@@ -9,6 +9,9 @@ export class UnamedAccount1703756315970 {
const users = await db.$queryRaw<
User[]
>`SELECT * FROM users WHERE name ~ E'^[\\s\\u2000-\\u200F]*$';`;
console.log(
`renaming ${users.map(({ email }) => email).join('|')} users`
);
await Promise.all(
users.map(({ id, email }) =>
@@ -50,7 +50,6 @@ export class MetricsModule implements OnModuleInit, OnModuleDestroy {
}
}
export { registerInstrumentations } from './instrumentations';
export * from './metrics';
export * from './utils';
export { OpentelemetryFactory };
@@ -1,32 +0,0 @@
import { Instrumentation } from '@opentelemetry/instrumentation';
import { GraphQLInstrumentation } from '@opentelemetry/instrumentation-graphql';
import { HttpInstrumentation } from '@opentelemetry/instrumentation-http';
import { IORedisInstrumentation } from '@opentelemetry/instrumentation-ioredis';
import { NestInstrumentation } from '@opentelemetry/instrumentation-nestjs-core';
import { SocketIoInstrumentation } from '@opentelemetry/instrumentation-socket.io';
import prismaInstrument from '@prisma/instrumentation';
const { PrismaInstrumentation } = prismaInstrument;
let instrumentations: Instrumentation[] = [];
export function registerInstrumentations(): void {
if (AFFiNE.metrics.enabled) {
instrumentations = [
new NestInstrumentation(),
new IORedisInstrumentation(),
new SocketIoInstrumentation({ traceReserved: true }),
new GraphQLInstrumentation({
mergeItems: true,
ignoreTrivialResolveSpans: true,
depth: 10,
}),
new HttpInstrumentation(),
new PrismaInstrumentation({ middleware: false }),
];
}
}
export function getRegisteredInstrumentations(): Instrumentation[] {
return instrumentations;
}
@@ -1,82 +1,52 @@
import { Attributes, metrics } from '@opentelemetry/api';
import { OnModuleDestroy } from '@nestjs/common';
import { metrics } from '@opentelemetry/api';
import {
CompositePropagator,
W3CBaggagePropagator,
W3CTraceContextPropagator,
} from '@opentelemetry/core';
import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-proto';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';
import { PrometheusExporter } from '@opentelemetry/exporter-prometheus';
import { ZipkinExporter } from '@opentelemetry/exporter-zipkin';
import { HostMetrics } from '@opentelemetry/host-metrics';
import { Instrumentation } from '@opentelemetry/instrumentation';
import { GraphQLInstrumentation } from '@opentelemetry/instrumentation-graphql';
import { HttpInstrumentation } from '@opentelemetry/instrumentation-http';
import { IORedisInstrumentation } from '@opentelemetry/instrumentation-ioredis';
import { NestInstrumentation } from '@opentelemetry/instrumentation-nestjs-core';
import { SocketIoInstrumentation } from '@opentelemetry/instrumentation-socket.io';
import { Resource } from '@opentelemetry/resources';
import type { MeterProvider } from '@opentelemetry/sdk-metrics';
import {
MetricProducer,
MetricReader,
PeriodicExportingMetricReader,
} from '@opentelemetry/sdk-metrics';
import { MetricProducer, MetricReader } from '@opentelemetry/sdk-metrics';
import { NodeSDK } from '@opentelemetry/sdk-node';
import {
BatchSpanProcessor,
SpanExporter,
TraceIdRatioBasedSampler,
} from '@opentelemetry/sdk-trace-node';
import {
SEMRESATTRS_K8S_CLUSTER_NAME,
SEMRESATTRS_K8S_NAMESPACE_NAME,
SEMRESATTRS_K8S_POD_NAME,
SEMRESATTRS_SERVICE_NAME,
SEMRESATTRS_SERVICE_VERSION,
} from '@opentelemetry/semantic-conventions';
import prismaInstrument from '@prisma/instrumentation';
import { getRegisteredInstrumentations } from './instrumentations';
import { PrismaMetricProducer } from './prisma';
function withBuiltinAttributesMetricReader(
reader: MetricReader,
attrs: Attributes
) {
const collect = reader.collect;
reader.collect = async options => {
const result = await collect.call(reader, options);
result.resourceMetrics.scopeMetrics.forEach(metrics => {
metrics.metrics.forEach(metric => {
metric.dataPoints.forEach(dataPoint => {
// @ts-expect-error allow
dataPoint.attributes = Object.assign({}, attrs, dataPoint.attributes);
});
});
});
return result;
};
return reader;
}
function withBuiltinAttributesSpanExporter(
exporter: SpanExporter,
attrs: Attributes
) {
const exportSpans = exporter.export;
exporter.export = (spans, callback) => {
spans.forEach(span => {
// patch span attributes
// @ts-expect-error allow
span.attributes = Object.assign({}, attrs, span.attributes);
});
return exportSpans.call(exporter, spans, callback);
};
return exporter;
}
const { PrismaInstrumentation } = prismaInstrument;
export abstract class OpentelemetryFactory {
abstract getMetricReader(): MetricReader;
abstract getSpanExporter(): SpanExporter;
getInstractions(): Instrumentation[] {
return getRegisteredInstrumentations();
return [
new NestInstrumentation(),
new IORedisInstrumentation(),
new SocketIoInstrumentation({ traceReserved: true }),
new GraphQLInstrumentation({ mergeItems: true }),
new HttpInstrumentation(),
new PrismaInstrumentation(),
];
}
getMetricsProducers(): MetricProducer[] {
@@ -85,32 +55,20 @@ export abstract class OpentelemetryFactory {
getResource() {
return new Resource({
[SEMRESATTRS_K8S_CLUSTER_NAME]: AFFiNE.flavor.type,
[SEMRESATTRS_K8S_NAMESPACE_NAME]: AFFiNE.AFFINE_ENV,
[SEMRESATTRS_K8S_POD_NAME]: process.env.HOSTNAME ?? process.env.HOST,
[SEMRESATTRS_SERVICE_NAME]: AFFiNE.flavor.type,
[SEMRESATTRS_SERVICE_VERSION]: AFFiNE.version,
});
}
getBuiltinAttributes(): Attributes {
return {
[SEMRESATTRS_SERVICE_VERSION]: AFFiNE.version,
};
}
create() {
const builtinAttributes = this.getBuiltinAttributes();
const traceExporter = this.getSpanExporter();
return new NodeSDK({
resource: this.getResource(),
sampler: new TraceIdRatioBasedSampler(0.1),
traceExporter: withBuiltinAttributesSpanExporter(
this.getSpanExporter(),
builtinAttributes
),
metricReader: withBuiltinAttributesMetricReader(
this.getMetricReader(),
builtinAttributes
),
traceExporter,
metricReader: this.getMetricReader(),
spanProcessor: new BatchSpanProcessor(traceExporter),
textMapPropagator: new CompositePropagator({
propagators: [
new W3CBaggagePropagator(),
@@ -123,19 +81,24 @@ export abstract class OpentelemetryFactory {
}
}
export class LocalOpentelemetryFactory extends OpentelemetryFactory {
override getMetricReader() {
return new PeriodicExportingMetricReader({
// requires jeager service running in 'http://localhost:4318'
// with metrics feature enabled.
// see https://www.jaegertracing.io/docs/1.56/spm
exporter: new OTLPMetricExporter(),
});
export class LocalOpentelemetryFactory
extends OpentelemetryFactory
implements OnModuleDestroy
{
private readonly metricsExporter = new PrometheusExporter({
metricProducers: this.getMetricsProducers(),
});
async onModuleDestroy() {
await this.metricsExporter.shutdown();
}
override getSpanExporter() {
// requires jeager service running in 'http://localhost:4318'
return new OTLPTraceExporter();
override getMetricReader(): MetricReader {
return this.metricsExporter;
}
override getSpanExporter(): SpanExporter {
return new ZipkinExporter();
}
}
-2
View File
@@ -6,9 +6,7 @@ import { omit } from 'lodash-es';
import { createApp } from './app';
import { URLHelper } from './fundamentals';
import { registerInstrumentations } from './fundamentals/metrics';
registerInstrumentations();
const app = await createApp();
const listeningHost = AFFiNE.deploy ? '0.0.0.0' : 'localhost';
await app.listen(AFFiNE.server.port, listeningHost);