Skip to content

Commit 6fb9f79

Browse files
authored
refactor(observability): drop the fork's OTEL divergence now that upstream covers it (#62)
2 parents 25e0090 + f40524c commit 6fb9f79

31 files changed

Lines changed: 1038 additions & 3723 deletions

‎apps/desktop/src/app/DesktopConfig.ts‎

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,13 @@ export const DesktopConfig = Config.all({
4848
otlpTracesUrl: trimmedString("T3CODE_OTLP_TRACES_URL"),
4949
otlpMetricsUrl: trimmedString("T3CODE_OTLP_METRICS_URL"),
5050
otlpLogsUrl: trimmedString("T3CODE_OTLP_LOGS_URL"),
51-
// Left as an Option rather than defaulted here: an unset variable is what
52-
// lets each signal fall back to the interval the OpenTelemetry environment
53-
// asked for, which the specification defines per signal.
54-
otlpExportIntervalMs: Config.Int("T3CODE_OTLP_EXPORT_INTERVAL_MS").pipe(Config.option),
55-
// Options for the same reason: unset is what lets the OpenTelemetry
56-
// environment supply headers and wire format instead.
51+
otlpExportIntervalMs: Config.Int("T3CODE_OTLP_EXPORT_INTERVAL_MS").pipe(
52+
Config.withDefault(10_000),
53+
),
5754
otlpHeaders: Config.schema(OtlpHeadersFromString, "T3CODE_OTLP_HEADERS").pipe(Config.option),
58-
otlpProtocol: Config.schema(OtlpProtocol, "T3CODE_OTLP_PROTOCOL").pipe(Config.option),
55+
otlpProtocol: Config.schema(OtlpProtocol, "T3CODE_OTLP_PROTOCOL").pipe(
56+
Config.withDefault("http/json"),
57+
),
5958
appImagePath: trimmedString("APPIMAGE"),
6059
disableAutoUpdate: optionalBoolean("T3CODE_DISABLE_AUTO_UPDATE"),
6160
mockUpdates: optionalBoolean("T3CODE_DESKTOP_MOCK_UPDATES"),

‎apps/desktop/src/app/DesktopEnvironment.test.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,15 +90,15 @@ describe("DesktopEnvironment", () => {
9090
assert.deepEqual(environment.otlpTracesUrl, Option.some("http://127.0.0.1:4318/v1/traces"));
9191
assert.deepEqual(environment.otlpMetricsUrl, Option.some("http://127.0.0.1:4318/v1/metrics"));
9292
assert.deepEqual(environment.otlpLogsUrl, Option.some("http://127.0.0.1:4318/v1/logs"));
93-
assert.deepEqual(environment.otlpExportIntervalMs, Option.some(2500));
93+
assert.equal(environment.otlpExportIntervalMs, 2500);
9494
assert.deepEqual(
9595
environment.otlpHeaders,
9696
Option.some({
9797
authorization: "Basic abc==",
9898
"x-tenant": "t3",
9999
}),
100100
);
101-
assert.deepEqual(environment.otlpProtocol, Option.some("http/protobuf"));
101+
assert.equal(environment.otlpProtocol, "http/protobuf");
102102
}),
103103
);
104104

@@ -116,7 +116,7 @@ describe("DesktopEnvironment", () => {
116116
assert.equal(environment.logDir, "/tmp/t3/userdata/logs");
117117
assert.equal(environment.browserArtifactsDir, "/tmp/t3/userdata/browser-artifacts");
118118
assert.equal(environment.serverSettingsPath, "/tmp/t3/userdata/settings.json");
119-
assert.deepEqual(environment.otlpProtocol, Option.none());
119+
assert.equal(environment.otlpProtocol, "http/json");
120120
}),
121121
);
122122

‎apps/desktop/src/app/DesktopEnvironment.ts‎

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import type {
44
DesktopRuntimeArch,
55
DesktopRuntimeInfo,
66
} from "@t3tools/contracts";
7-
import * as OtelEnvironment from "@t3tools/shared/otelEnvironment";
87
import * as Config from "effect/Config";
98
import * as Context from "effect/Context";
109
import * as Effect from "effect/Effect";
@@ -77,16 +76,9 @@ export class DesktopEnvironment extends Context.Service<
7776
readonly otlpTracesUrl: Option.Option<string>;
7877
readonly otlpMetricsUrl: Option.Option<string>;
7978
readonly otlpLogsUrl: Option.Option<string>;
80-
readonly otlpExportIntervalMs: Option.Option<number>;
79+
readonly otlpExportIntervalMs: number;
8180
readonly otlpHeaders: Option.Option<Record<string, string>>;
82-
readonly otlpProtocol: Option.Option<OtlpProtocol>;
83-
/**
84-
* What the standard `OTEL_*` variables asked for. The `T3CODE_OTLP_*`
85-
* values above still win per signal; this is what the main process
86-
* falls back to, and it carries the headers, wire format, resource, and
87-
* batching that T3 Code has no names of its own for.
88-
*/
89-
readonly otelEnvironment: OtelEnvironment.OtelEnvironment;
81+
readonly otlpProtocol: OtlpProtocol;
9082
readonly branding: DesktopAppBranding;
9183
readonly displayName: string;
9284
readonly appUserModelId: string;
@@ -163,7 +155,6 @@ const make = Effect.fn("desktop.environment.make")(function* (
163155
): Effect.fn.Return<DesktopEnvironment["Service"], Config.ConfigError, Path.Path> {
164156
const path = yield* Path.Path;
165157
const config = yield* DesktopConfig.DesktopConfig;
166-
const otelEnvironment = yield* OtelEnvironment.load;
167158
const homeDirectory = input.homeDirectory;
168159
const devServerUrl = config.devServerUrl;
169160
const isDevelopment = Option.isSome(devServerUrl);
@@ -246,7 +237,6 @@ const make = Effect.fn("desktop.environment.make")(function* (
246237
otlpExportIntervalMs: config.otlpExportIntervalMs,
247238
otlpHeaders: config.otlpHeaders,
248239
otlpProtocol: config.otlpProtocol,
249-
otelEnvironment,
250240
branding,
251241
displayName,
252242
appUserModelId: Option.getOrElse(config.appUserModelIdOverride, () =>

‎apps/desktop/src/app/DesktopObservability.test.ts‎

Lines changed: 71 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import * as NodeHttpClient from "@effect/platform-node/NodeHttpClient";
22
import * as NodeServices from "@effect/platform-node/NodeServices";
33
import { assert, describe, it } from "@effect/vitest";
4+
import * as ConfigProvider from "effect/ConfigProvider";
45
import * as Effect from "effect/Effect";
56
import * as FileSystem from "effect/FileSystem";
67
import * as Layer from "effect/Layer";
@@ -92,6 +93,9 @@ const collectorLayer = (requests: Array<ExportedRequest>) =>
9293
),
9394
);
9495

96+
// A developer's own OTEL_* variables would otherwise pick the endpoints.
97+
const emptyEnv = ConfigProvider.layer(ConfigProvider.fromEnv({ env: {} }));
98+
9599
const encodeObservabilitySettingsFile = Schema.encodeSync(
96100
Schema.fromJsonString(
97101
Schema.Struct({ observability: Schema.Record(Schema.String, Schema.String) }),
@@ -181,7 +185,7 @@ describe("DesktopObservability", () => {
181185
assert.isFalse(yield* fileSystem.exists(logPath));
182186
}).pipe(
183187
Effect.scoped,
184-
Effect.provide(Layer.mergeAll(NodeServices.layer, NodeHttpClient.layerUndici)),
188+
Effect.provide(Layer.mergeAll(NodeServices.layer, NodeHttpClient.layerUndici, emptyEnv)),
185189
),
186190
);
187191

@@ -259,7 +263,7 @@ describe("DesktopObservability", () => {
259263
);
260264
}).pipe(
261265
Effect.scoped,
262-
Effect.provide(Layer.mergeAll(NodeServices.layer, NodeHttpClient.layerUndici)),
266+
Effect.provide(Layer.mergeAll(NodeServices.layer, NodeHttpClient.layerUndici, emptyEnv)),
263267
),
264268
);
265269

@@ -299,7 +303,7 @@ describe("DesktopObservability", () => {
299303
assert.equal(records.at(-1)?.annotations.details, "code=1");
300304
}).pipe(
301305
Effect.scoped,
302-
Effect.provide(Layer.mergeAll(NodeServices.layer, NodeHttpClient.layerUndici)),
306+
Effect.provide(Layer.mergeAll(NodeServices.layer, NodeHttpClient.layerUndici, emptyEnv)),
303307
),
304308
);
305309

@@ -343,7 +347,7 @@ describe("DesktopObservability", () => {
343347
assert.isFalse(text.includes("y"));
344348
}).pipe(
345349
Effect.scoped,
346-
Effect.provide(Layer.mergeAll(NodeServices.layer, NodeHttpClient.layerUndici)),
350+
Effect.provide(Layer.mergeAll(NodeServices.layer, NodeHttpClient.layerUndici, emptyEnv)),
347351
),
348352
);
349353

@@ -377,7 +381,7 @@ describe("DesktopObservability", () => {
377381
assert.equal(lines.length, 258);
378382
}).pipe(
379383
Effect.scoped,
380-
Effect.provide(Layer.mergeAll(NodeServices.layer, NodeHttpClient.layerUndici)),
384+
Effect.provide(Layer.mergeAll(NodeServices.layer, NodeHttpClient.layerUndici, emptyEnv)),
381385
),
382386
);
383387

@@ -423,7 +427,7 @@ describe("DesktopObservability", () => {
423427
assert.lengthOf(record?.events ?? [], 0);
424428
}).pipe(
425429
Effect.scoped,
426-
Effect.provide(Layer.mergeAll(NodeServices.layer, collectorLayer(requests))),
430+
Effect.provide(Layer.mergeAll(NodeServices.layer, collectorLayer(requests), emptyEnv)),
427431
);
428432
});
429433

@@ -436,9 +440,6 @@ describe("DesktopObservability", () => {
436440
});
437441
const environmentLayer = makeEnvironmentLayer(baseDir, true, {
438442
T3CODE_OTLP_HEADERS: "x-scope=desktop",
439-
OTEL_EXPORTER_OTLP_ENDPOINT: "https://collector.example.com",
440-
OTEL_EXPORTER_OTLP_HEADERS: "x-otel=desktop",
441-
OTEL_EXPORTER_OTLP_LOGS_PROTOCOL: "http/json",
442443
});
443444
yield* writeObservabilitySettings(environmentLayer, {
444445
otlpLogsUrl: "https://settings.example.com/v1/logs",
@@ -458,7 +459,21 @@ describe("DesktopObservability", () => {
458459
assert.strictEqual(request?.headers["content-type"], "application/json");
459460
}).pipe(
460461
Effect.scoped,
461-
Effect.provide(Layer.mergeAll(NodeServices.layer, collectorLayer(requests))),
462+
Effect.provide(
463+
Layer.mergeAll(
464+
NodeServices.layer,
465+
collectorLayer(requests),
466+
ConfigProvider.layer(
467+
ConfigProvider.fromEnv({
468+
env: {
469+
OTEL_EXPORTER_OTLP_ENDPOINT: "https://collector.example.com",
470+
OTEL_EXPORTER_OTLP_HEADERS: "x-otel=desktop",
471+
OTEL_EXPORTER_OTLP_LOGS_PROTOCOL: "http/json",
472+
},
473+
}),
474+
),
475+
),
476+
),
462477
);
463478
});
464479

@@ -471,9 +486,6 @@ describe("DesktopObservability", () => {
471486
});
472487
const environmentLayer = makeEnvironmentLayer(baseDir, true, {
473488
T3CODE_OTLP_LOGS_URL: "https://collector.example.com/v1/logs",
474-
OTEL_SERVICE_NAME: "renamed",
475-
OTEL_RESOURCE_ATTRIBUTES:
476-
"service.name=renamed,service.namespace=renamed,deployment.environment.name=development",
477489
});
478490

479491
yield* Effect.scoped(
@@ -490,7 +502,21 @@ describe("DesktopObservability", () => {
490502
assert.notInclude(body, "renamed");
491503
}).pipe(
492504
Effect.scoped,
493-
Effect.provide(Layer.mergeAll(NodeServices.layer, collectorLayer(requests))),
505+
Effect.provide(
506+
Layer.mergeAll(
507+
NodeServices.layer,
508+
collectorLayer(requests),
509+
ConfigProvider.layer(
510+
ConfigProvider.fromEnv({
511+
env: {
512+
OTEL_SERVICE_NAME: "renamed",
513+
OTEL_RESOURCE_ATTRIBUTES:
514+
"service.name=renamed,service.namespace=renamed,deployment.environment.name=development",
515+
},
516+
}),
517+
),
518+
),
519+
),
494520
);
495521
});
496522

@@ -503,8 +529,6 @@ describe("DesktopObservability", () => {
503529
});
504530
const environmentLayer = makeEnvironmentLayer(baseDir, true, {
505531
T3CODE_OTLP_HEADERS: "x-scope=desktop",
506-
OTEL_EXPORTER_OTLP_ENDPOINT: "https://collector.example.com",
507-
OTEL_EXPORTER_OTLP_LOGS_PROTOCOL: "grpc",
508532
});
509533
yield* writeObservabilitySettings(environmentLayer, {
510534
otlpLogsUrl: "https://settings.example.com/v1/logs",
@@ -519,7 +543,20 @@ describe("DesktopObservability", () => {
519543
assert.lengthOf(requests, 0);
520544
}).pipe(
521545
Effect.scoped,
522-
Effect.provide(Layer.mergeAll(NodeServices.layer, collectorLayer(requests))),
546+
Effect.provide(
547+
Layer.mergeAll(
548+
NodeServices.layer,
549+
collectorLayer(requests),
550+
ConfigProvider.layer(
551+
ConfigProvider.fromEnv({
552+
env: {
553+
OTEL_EXPORTER_OTLP_ENDPOINT: "https://collector.example.com",
554+
OTEL_EXPORTER_OTLP_LOGS_PROTOCOL: "grpc",
555+
},
556+
}),
557+
),
558+
),
559+
),
523560
);
524561
});
525562

@@ -532,7 +569,6 @@ describe("DesktopObservability", () => {
532569
});
533570
const environmentLayer = makeEnvironmentLayer(baseDir, true, {
534571
T3CODE_OTLP_LOGS_URL: "https://collector.example.com/v1/logs",
535-
OTEL_SDK_DISABLED: "1",
536572
});
537573

538574
yield* Effect.scoped(
@@ -544,7 +580,13 @@ describe("DesktopObservability", () => {
544580
assert.include(requests[0]?.body ?? "", "OTEL_SDK_DISABLED=1 was read as false");
545581
}).pipe(
546582
Effect.scoped,
547-
Effect.provide(Layer.mergeAll(NodeServices.layer, collectorLayer(requests))),
583+
Effect.provide(
584+
Layer.mergeAll(
585+
NodeServices.layer,
586+
collectorLayer(requests),
587+
ConfigProvider.layer(ConfigProvider.fromEnv({ env: { OTEL_SDK_DISABLED: "1" } })),
588+
),
589+
),
548590
);
549591
});
550592

@@ -585,7 +627,7 @@ describe("DesktopObservability", () => {
585627
);
586628
}).pipe(
587629
Effect.scoped,
588-
Effect.provide(Layer.mergeAll(NodeServices.layer, collectorLayer(requests))),
630+
Effect.provide(Layer.mergeAll(NodeServices.layer, collectorLayer(requests), emptyEnv)),
589631
);
590632
});
591633

@@ -609,7 +651,7 @@ describe("DesktopObservability", () => {
609651
assert.lengthOf(requests, 0);
610652
}).pipe(
611653
Effect.scoped,
612-
Effect.provide(Layer.mergeAll(NodeServices.layer, collectorLayer(requests))),
654+
Effect.provide(Layer.mergeAll(NodeServices.layer, collectorLayer(requests), emptyEnv)),
613655
);
614656
});
615657

@@ -620,9 +662,7 @@ describe("DesktopObservability", () => {
620662
const baseDir = yield* fileSystem.makeTempDirectoryScoped({
621663
prefix: "t3-desktop-observability-test-",
622664
});
623-
const environmentLayer = makeEnvironmentLayer(baseDir, true, {
624-
OTEL_SDK_DISABLED: "true",
625-
});
665+
const environmentLayer = makeEnvironmentLayer(baseDir);
626666
yield* writeObservabilitySettings(environmentLayer, {
627667
otlpTracesUrl: "https://settings.example.com/v1/traces",
628668
otlpLogsUrl: "https://settings.example.com/v1/logs",
@@ -638,7 +678,13 @@ describe("DesktopObservability", () => {
638678
assert.lengthOf(requests, 0);
639679
}).pipe(
640680
Effect.scoped,
641-
Effect.provide(Layer.mergeAll(NodeServices.layer, collectorLayer(requests))),
681+
Effect.provide(
682+
Layer.mergeAll(
683+
NodeServices.layer,
684+
collectorLayer(requests),
685+
ConfigProvider.layer(ConfigProvider.fromEnv({ env: { OTEL_SDK_DISABLED: "true" } })),
686+
),
687+
),
642688
);
643689
});
644690
});

0 commit comments

Comments
 (0)