{"record":{"id":"5f99a1280bd7c937","repo":"immich-app/immich","slug":"invalid-telemetry-found-telemetry","errorCode":null,"errorMessage":"Invalid telemetry found: ${telemetry}","messagePattern":"Invalid telemetry found: (.+?)","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"critical","filePath":"server/src/repositories/config.repository.ts","lineNumber":229,"sourceCode":"  const redisUrl = dto.REDIS_URL;\n  if (redisUrl && redisUrl.startsWith('ioredis://')) {\n    try {\n      redisConfig = JSON.parse(Buffer.from(redisUrl.slice(10), 'base64').toString());\n    } catch (error) {\n      throw new Error('Failed to decode redis options', { cause: error });\n    }\n  }\n\n  const includedTelemetries =\n    dto.IMMICH_TELEMETRY_INCLUDE === 'all'\n      ? new Set(Object.values(ImmichTelemetry))\n      : asSet<ImmichTelemetry>(dto.IMMICH_TELEMETRY_INCLUDE, []);\n\n  const excludedTelemetries = asSet<ImmichTelemetry>(dto.IMMICH_TELEMETRY_EXCLUDE, []);\n  const telemetries = setDifference(includedTelemetries, excludedTelemetries);\n  for (const telemetry of telemetries) {\n    if (!TELEMETRY_TYPES.has(telemetry)) {\n      throw new Error(`Invalid telemetry found: ${telemetry}`);\n    }\n  }\n\n  const databaseConnection: DatabaseConnectionParams = dto.DB_URL\n    ? { connectionType: 'url', url: dto.DB_URL }\n    : {\n        connectionType: 'parts',\n        host: dto.DB_HOSTNAME || 'database',\n        port: dto.DB_PORT || 5432,\n        username: dto.DB_USERNAME || 'postgres',\n        password: dto.DB_PASSWORD || 'postgres',\n        database: dto.DB_DATABASE_NAME || 'immich',\n        ssl: dto.DB_SSL_MODE || undefined,\n      };\n\n  let vectorExtension: VectorExtension | undefined;\n  if (dto.DB_VECTOR_EXTENSION) {\n    switch (dto.DB_VECTOR_EXTENSION) {","sourceCodeStart":211,"sourceCodeEnd":247,"githubUrl":"https://github.com/immich-app/immich/blob/199723261c6ffa897fec8ccdaea6359e39c37cc3/server/src/repositories/config.repository.ts#L211-L247","documentation":"getEnv() computes the telemetry set from IMMICH_TELEMETRY_INCLUDE/EXCLUDE (or 'all') and validates each entry against TELEMETRY_TYPES. Any unknown telemetry name throws Error('Invalid telemetry found: <name>'). This is a startup-time config guard.","triggerScenarios":"Setting IMMICH_TELEMETRY_INCLUDE or IMMICH_TELEMETRY_EXCLUDE to a comma-separated list containing a value that is not a valid ImmichTelemetry enum member.","commonSituations":"Typo in a telemetry backend name; referencing a telemetry option removed/renamed in this version; copying a stale config from an older release.","solutions":["Compare the listed telemetry name to the current ImmichTelemetry enum and correct the typo/renamed value.","Remove unknown entries from IMMICH_TELEMETRY_INCLUDE/EXCLUDE.","Use IMMICH_TELEMETRY_INCLUDE=all to enable every supported backend without naming them."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"import { ImmichTelemetry } from '@immich/sdk';\nconst VALID = new Set(Object.values(ImmichTelemetry));\nconst requested = (process.env.IMMICH_TELEMETRY_INCLUDE ?? '').split(',').filter(Boolean);\nconst bad = requested.filter((t) => !VALID.has(t as ImmichTelemetry));\nif (bad.length) throw new Error(`Unknown telemetry: ${bad.join(', ')}`);","typeGuard":"const isTelemetry = (v: string): v is ImmichTelemetry =>\n  new Set(Object.values(ImmichTelemetry)).has(v as ImmichTelemetry);","tryCatchPattern":null,"preventionTips":["Use IMMICH_TELEMETRY_INCLUDE=all to avoid naming individual backends.","Re-check telemetry enum values after upgrades.","Keep observability config in version control and lint it."],"tags":["configuration","environment","telemetry","validation","startup"],"backgroundTag":null,"analyzedSha":"199723261c6ffa897fec8ccdaea6359e39c37cc3","analyzedAt":"2026-08-12T04:54:27.085Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}