diff --git a/packages/services/api/src/create.ts b/packages/services/api/src/create.ts index 9f9389d8f0d..ab80f1fe955 100644 --- a/packages/services/api/src/create.ts +++ b/packages/services/api/src/create.ts @@ -29,6 +29,7 @@ import { oidcIntegrationsModule } from './modules/oidc-integrations'; import { OIDC_INTEGRATIONS_ENABLED } from './modules/oidc-integrations/providers/tokens'; import { operationsModule } from './modules/operations'; import { CLICKHOUSE_CONFIG, ClickHouseConfig } from './modules/operations/providers/tokens'; +import { OTEL_TRACING_ENABLED } from './modules/operations/providers/traces'; import { organizationModule } from './modules/organization'; import { schemaPolicyModule } from './modules/policy'; import { @@ -113,6 +114,7 @@ export function createRegistry({ organizationOIDC, pubSub, appDeploymentsEnabled, + otelTracingEnabled, prometheus, }: { logger: Logger; @@ -157,6 +159,7 @@ export function createRegistry({ organizationOIDC: boolean; pubSub: HivePubSub; appDeploymentsEnabled: boolean; + otelTracingEnabled: boolean; prometheus: null | Record; }) { const s3Config: S3Config = [ @@ -284,6 +287,11 @@ export function createRegistry({ useValue: appDeploymentsEnabled, scope: Scope.Singleton, }, + { + provide: OTEL_TRACING_ENABLED, + useValue: otelTracingEnabled, + scope: Scope.Singleton, + }, { provide: WEB_APP_URL, useValue: app?.baseUrl.replace(/\/$/, '') ?? 'http://localhost:3000', diff --git a/packages/services/api/src/modules/operations/providers/traces.ts b/packages/services/api/src/modules/operations/providers/traces.ts index 6a3093f85b3..ae319e6654c 100644 --- a/packages/services/api/src/modules/operations/providers/traces.ts +++ b/packages/services/api/src/modules/operations/providers/traces.ts @@ -1,6 +1,6 @@ import DataLoader from 'dataloader'; import stableJSONStringify from 'fast-json-stable-stringify'; -import { Injectable } from 'graphql-modules'; +import { Inject, Injectable, InjectionToken } from 'graphql-modules'; import { z } from 'zod'; import { subDays } from '@/lib/date-time'; import * as GraphQLSchema from '../../../__generated__/types'; @@ -12,6 +12,8 @@ import { ClickHouse, sql } from './clickhouse-client'; import { formatDate } from './operations-reader'; import { SqlValue } from './sql'; +export const OTEL_TRACING_ENABLED = new InjectionToken('OTEL_TRACING_ENABLED'); + @Injectable({ global: true, }) @@ -20,11 +22,12 @@ export class Traces { private clickHouse: ClickHouse, private logger: Logger, private storage: Storage, + @Inject(OTEL_TRACING_ENABLED) private otelTracingEnabled: boolean, ) {} async viewerCanAccessTraces(organizationId: string) { const organization = await this.storage.getOrganization({ organizationId }); - return organization.featureFlags.otelTracing; + return organization.featureFlags.otelTracing || this.otelTracingEnabled; } private async _guardViewerCanAccessTraces(organizationId: string) { diff --git a/packages/services/api/src/modules/organization/providers/organization-access-tokens.ts b/packages/services/api/src/modules/organization/providers/organization-access-tokens.ts index 1d63ec9587f..d8388d36e19 100644 --- a/packages/services/api/src/modules/organization/providers/organization-access-tokens.ts +++ b/packages/services/api/src/modules/organization/providers/organization-access-tokens.ts @@ -22,6 +22,7 @@ import { resourceLevelToHumanReadableName, resourceLevelToResourceLevelType, } from '../../auth/resolvers/Permission'; +import { OTEL_TRACING_ENABLED } from '../../operations/providers/traces'; import { IdTranslator } from '../../shared/providers/id-translator'; import { Logger } from '../../shared/providers/logger'; import { PG_POOL_CONFIG } from '../../shared/providers/pg-pool'; @@ -152,6 +153,7 @@ export class OrganizationAccessTokens { private storage: Storage, private members: OrganizationMembers, logger: Logger, + @Inject(OTEL_TRACING_ENABLED) private otelTracingEnabled: boolean, ) { this.logger = logger.child({ source: 'OrganizationAccessTokens', @@ -890,7 +892,7 @@ export class OrganizationAccessTokens { private createFeatureFlagPermissionFilter(organization: Organization) { const isAppDeplymentsEnabled = organization.featureFlags.appDeployments; - const isOTELTracingEnabled = organization.featureFlags.otelTracing; + const isOTELTracingEnabled = organization.featureFlags.otelTracing || this.otelTracingEnabled; return (id: Permission) => (!isAppDeplymentsEnabled && id.startsWith('appDeployment:')) || diff --git a/packages/services/server/.env.template b/packages/services/server/.env.template index 2f724735e9f..58e7657ea6a 100644 --- a/packages/services/server/.env.template +++ b/packages/services/server/.env.template @@ -24,6 +24,7 @@ INTEGRATION_GITHUB="" INTEGRATION_GITHUB_APP_ID="" INTEGRATION_GITHUB_APP_PRIVATE_KEY="" FEATURE_FLAGS_APP_DEPLOYMENTS_ENABLED="0" +FEATURE_FLAGS_OTEL_TRACING_ENABLED="0" # Zendesk Support ZENDESK_SUPPORT='0' diff --git a/packages/services/server/src/environment.ts b/packages/services/server/src/environment.ts index 08d28b3eadc..5d7c6312bb3 100644 --- a/packages/services/server/src/environment.ts +++ b/packages/services/server/src/environment.ts @@ -42,6 +42,9 @@ const EnvironmentModel = zod.object({ FEATURE_FLAGS_APP_DEPLOYMENTS_ENABLED: emptyString( zod.union([zod.literal('1'), zod.literal('0')]).optional(), ), + FEATURE_FLAGS_OTEL_TRACING_ENABLED: emptyString( + zod.union([zod.literal('1'), zod.literal('0')]).optional(), + ), }); const CommerceModel = zod.object({ @@ -529,5 +532,7 @@ export const env = { featureFlags: { /** Whether app deployments should be enabled by default for everyone. */ appDeploymentsEnabled: base.FEATURE_FLAGS_APP_DEPLOYMENTS_ENABLED === '1', + /** Whether OTEL tracing should be enabled for all organizations. */ + otelTracingEnabled: base.FEATURE_FLAGS_OTEL_TRACING_ENABLED === '1', }, } as const; diff --git a/packages/services/server/src/index.ts b/packages/services/server/src/index.ts index 8ed576e2650..b8066a84860 100644 --- a/packages/services/server/src/index.ts +++ b/packages/services/server/src/index.ts @@ -403,6 +403,7 @@ export async function main() { supportConfig: env.zendeskSupport, pubSub, appDeploymentsEnabled: env.featureFlags.appDeploymentsEnabled, + otelTracingEnabled: env.featureFlags.otelTracingEnabled, prometheus: env.prometheus, });