@@ -9,20 +9,51 @@ import { settleAsyncResult, squashAtomCommandFailure } from "@t3tools/client-run
99import { safeErrorLogAttributes } from "@t3tools/client-runtime/errors" ;
1010import { resolvePrimaryEnvironmentHttpUrl } from "../environments/primary" ;
1111import * as ClientTracer from "./clientTracer" ;
12+ import { serviceInstanceId } from "./serviceInstance" ;
1213import { primaryEnvironmentHttpLayer } from "../environments/primary/httpLayer" ;
1314import { isElectron } from "../env" ;
1415import { APP_VERSION } from "~/branding" ;
1516
1617const DEFAULT_EXPORT_INTERVAL_MS = 1_000 ;
18+ interface NavigatorUserAgentData {
19+ readonly platform : string ;
20+ readonly mobile : boolean ;
21+ readonly brands : ReadonlyArray < { readonly brand : string ; readonly version : string } > ;
22+ }
23+
24+ /**
25+ * The same `browser.*` and `user_agent.original` attributes the OpenTelemetry
26+ * browser resource detector reports, plus the `process.runtime.*` values the
27+ * semantic conventions give a web browser. `userAgentData` exists only in
28+ * Chromium, which includes the desktop app.
29+ */
30+ const browserResourceAttributes = ( ) : Record < string , unknown > => {
31+ if ( typeof navigator === "undefined" ) return { } ;
32+ const userAgentData = ( navigator as Navigator & { userAgentData ?: NavigatorUserAgentData } )
33+ . userAgentData ;
34+ return {
35+ "user_agent.original" : navigator . userAgent ,
36+ "process.runtime.name" : "browser" ,
37+ "process.runtime.version" : navigator . userAgent ,
38+ "browser.language" : navigator . language ,
39+ ...( userAgentData && {
40+ "browser.platform" : userAgentData . platform ,
41+ "browser.mobile" : userAgentData . mobile ,
42+ "browser.brands" : userAgentData . brands . map ( ( { brand, version } ) => `${ brand } ${ version } ` ) ,
43+ } ) ,
44+ } ;
45+ } ;
46+
1747const CLIENT_TRACING_RESOURCE = {
1848 serviceName : "t3code-web" ,
49+ serviceVersion : APP_VERSION ,
1950 attributes : {
2051 "service.namespace" : "t3code" ,
21- "service.runtime " : "t3-web" ,
22- "service.mode " : isElectron ? "electron " : "browser " ,
23- "service.version" : APP_VERSION ,
52+ "service.instance.id " : serviceInstanceId ,
53+ "t3code.client.surface " : isElectron ? "desktop " : "web " ,
54+ ... browserResourceAttributes ( ) ,
2455 } ,
25- } as const ;
56+ } ;
2657
2758const delegateRuntimeLayer = Layer . mergeAll (
2859 primaryEnvironmentHttpLayer ,
0 commit comments