immich-app/immich · critical · Error

Invalid telemetry found: ${telemetry}

Error message

Invalid telemetry found: ${telemetry}

What it means

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.

Source

Thrown at server/src/repositories/config.repository.ts:229

  const redisUrl = dto.REDIS_URL;
  if (redisUrl && redisUrl.startsWith('ioredis://')) {
    try {
      redisConfig = JSON.parse(Buffer.from(redisUrl.slice(10), 'base64').toString());
    } catch (error) {
      throw new Error('Failed to decode redis options', { cause: error });
    }
  }

  const includedTelemetries =
    dto.IMMICH_TELEMETRY_INCLUDE === 'all'
      ? new Set(Object.values(ImmichTelemetry))
      : asSet<ImmichTelemetry>(dto.IMMICH_TELEMETRY_INCLUDE, []);

  const excludedTelemetries = asSet<ImmichTelemetry>(dto.IMMICH_TELEMETRY_EXCLUDE, []);
  const telemetries = setDifference(includedTelemetries, excludedTelemetries);
  for (const telemetry of telemetries) {
    if (!TELEMETRY_TYPES.has(telemetry)) {
      throw new Error(`Invalid telemetry found: ${telemetry}`);
    }
  }

  const databaseConnection: DatabaseConnectionParams = dto.DB_URL
    ? { connectionType: 'url', url: dto.DB_URL }
    : {
        connectionType: 'parts',
        host: dto.DB_HOSTNAME || 'database',
        port: dto.DB_PORT || 5432,
        username: dto.DB_USERNAME || 'postgres',
        password: dto.DB_PASSWORD || 'postgres',
        database: dto.DB_DATABASE_NAME || 'immich',
        ssl: dto.DB_SSL_MODE || undefined,
      };

  let vectorExtension: VectorExtension | undefined;
  if (dto.DB_VECTOR_EXTENSION) {
    switch (dto.DB_VECTOR_EXTENSION) {

View on GitHub (pinned to 199723261c)

Solutions

  1. Compare the listed telemetry name to the current ImmichTelemetry enum and correct the typo/renamed value.
  2. Remove unknown entries from IMMICH_TELEMETRY_INCLUDE/EXCLUDE.
  3. Use IMMICH_TELEMETRY_INCLUDE=all to enable every supported backend without naming them.
Defensive patterns

Strategy: validation

Validate before calling

import { ImmichTelemetry } from '@immich/sdk';
const VALID = new Set(Object.values(ImmichTelemetry));
const requested = (process.env.IMMICH_TELEMETRY_INCLUDE ?? '').split(',').filter(Boolean);
const bad = requested.filter((t) => !VALID.has(t as ImmichTelemetry));
if (bad.length) throw new Error(`Unknown telemetry: ${bad.join(', ')}`);

Type guard

const isTelemetry = (v: string): v is ImmichTelemetry =>
  new Set(Object.values(ImmichTelemetry)).has(v as ImmichTelemetry);

Prevention

When it happens

Trigger: Setting IMMICH_TELEMETRY_INCLUDE or IMMICH_TELEMETRY_EXCLUDE to a comma-separated list containing a value that is not a valid ImmichTelemetry enum member.

Common situations: Typo in a telemetry backend name; referencing a telemetry option removed/renamed in this version; copying a stale config from an older release.

Related errors


AI-assisted analysis of immich-app/immich@199723261c (2026-08-12). Data as JSON: /api/errors/5f99a1280bd7c937. Report an issue: GitHub.