jaegertracing/jaeger · error

failed to query dependencies: %w

Error message

failed to query dependencies: %w

What it means

ClickHouse depstore Reader.GetDependencies queries the jaeger_dependencies table for dependency-link snapshots between the query's start and end times. If the underlying clickhouse-go Query call fails — connection errors, DNS failure, auth rejection, malformed SQL/table missing — the error is wrapped with this message and returned. The %w wrap preserves the driver error for errors.Is/As inspection.

Source

Thrown at internal/storage/v2/clickhouse/depstore/reader.go:37

type Reader struct {
	conn driver.Conn
}

func NewDependencyReader(conn driver.Conn) *Reader {
	return &Reader{conn: conn}
}

// dependencyKey groups dependency links by (parent, child) for merging.
type dependencyKey struct {
	parent string
	child  string
}

func (r *Reader) GetDependencies(ctx context.Context, query depstore.QueryParameters) ([]model.DependencyLink, error) {
	rows, err := r.conn.Query(ctx, sql.SelectDependencies, query.StartTime, query.EndTime)
	if err != nil {
		return nil, fmt.Errorf("failed to query dependencies: %w", err)
	}
	defer rows.Close()

	// Merge dependencies from all snapshots in the time range.
	merged := make(map[dependencyKey]uint64)

	for rows.Next() {
		var blob string
		if err := rows.Scan(&blob); err != nil {
			return nil, fmt.Errorf("failed to scan dependency row: %w", err)
		}
		var links []dependencyLink
		if err := json.Unmarshal([]byte(blob), &links); err != nil {
			return nil, fmt.Errorf("failed to unmarshal dependencies JSON: %w", err)
		}
		for _, link := range links {
			merged[dependencyKey{link.Parent, link.Child}] += link.CallCount
		}

View on GitHub (pinned to 806f444784)

Solutions

  1. Verify ClickHouse connectivity (address, port, credentials, TLS) in the storage configuration and that the server is up.
  2. Confirm the schema is initialized (jaeger_dependencies table exists) with the correct database name.
  3. Inspect the wrapped driver error via errors.Is/As (e.g. clickhouse exceptions) to pinpoint auth vs network vs SQL causes; check context deadlines.

Example fix

// config before
storage: { clickhouse: { address: "clickhouse:9009" } }
// after (default native port)
storage: { clickhouse: { address: "clickhouse:9000", database: "jaeger" } }
Defensive patterns

Strategy: try-catch

Validate before calling

if err := conn.Ping(ctx); err != nil {
  return fmt.Errorf("clickhouse unreachable: %w", err)
}
if query.StartTime.After(query.EndTime) {
  return errors.New("invalid dependency query range")
}

Try / catch

deps, err := reader.GetDependencies(ctx, q)
if err != nil {
  var chEx *clickhouse.Exception
  if errors.As(err, &chEx) {
    log.Printf("clickhouse error code=%d: %v", chEx.Code, chEx)
  } else if errors.Is(err, context.DeadlineExceeded) {
    log.Printf("dependency query timed out")
  }
  return fmt.Errorf("getting dependencies: %w", err)
}

Prevention

When it happens

Trigger: Calling GetDependencies(ctx, depstore.QueryParameters{StartTime, EndTime}) when r.conn.Query(ctx, sql.SelectDependencies, ...) returns an error: server unreachable, credentials invalid, database/table absent, context canceled before the query starts.

Common situations: ClickHouse endpoint misconfigured in the storage config; ClickHouse down or restarting; wrong username/password or TLS settings; network policy blocking port 9000/8123; table not created by schema initialization.

Understand the failure class

Background: Database query failed: Internal Server Error 500s wrapping SQL, Prisma, and connection failures — what to check first — this error's family across 16 libraries.

Related errors


AI-assisted analysis of jaegertracing/jaeger@806f444784 (2026-09-01). Data as JSON: /api/errors/7e73952ec7c7637a. Report an issue: GitHub.