{ nixosTest, tempo, writeText }:

nixosTest {
  name = "tempo";
  nodes.machine = let
    dataDir = "/var/lib/tempo";
    tempoConfig = {
      search_enabled = true;
      metrics_generator_enabled = true;
      server = {
        http_listen_address = "127.0.0.1";
        http_listen_port = 8888;
      };
      ingester = {
        trace_idle_period = "30s";
        max_block_bytes = 1000000;
        max_block_duration = "5m";
      };
      compactor = {
        compaction = {
          compaction_window = "1h";
          max_block_bytes = 100000000;
          compacted_block_retention = "10m";
        };
      };
      storage.trace = {
        backend = "local";
        block = {
          bloom_filter_false_positive = 0.05;
          index_downsample_bytes = 1000;
          encoding = "zstd";
        };
        wal.path = "${dataDir}/wal";
        wal.encoding = "snappy";
        local.path = "${dataDir}/blocks";
        pool = {
          max_workers = 16;
          queue_depth = 1000;
        };
      };
      metrics_generator = {
        registry.external_labels = {
          source = "tempo";
        };
        storage = {
          path = "${dataDir}/generator/wal";
        };
      };
      overrides.metrics_generator_processors = [
        "service-graphs"
        "span-metrics"
      ];
    };
  in {
    users.users.tempo = {
      isSystemUser = true;
      group = "tempo";
      home = dataDir;
      createHome = true;
    };

    users.groups.tempo = {};
    systemd.services.tempo = {
      wantedBy = [ "multi-user.target" ];
      serviceConfig = {
        User = "tempo";
        Group = "tempo";
        ExecStart = "${tempo}/bin/tempo -config.file=${writeText "tempo.yaml" (builtins.toJSON tempoConfig)}";
        PrivateTmp = true;
      };
    };
  };
  testScript = ''
    machine.wait_for_unit("tempo.service")
    machine.wait_for_open_port(8888)
    machine.succeed("curl --fail http://127.0.0.1:8888/status/version")
  '';
}