Skip to content

Metrics ​

OpenViking provides a machine-oriented metrics system for exposing runtime health, request status, model usage, resource processing throughput, and probe health states.

Unlike the human-facing /api/v1/observer/* endpoints and the analytics-oriented /api/v1/stats/* endpoints, Metrics are designed for:

  • high-frequency scraping by Prometheus, Grafana Agent, and similar systems
  • low-cardinality, aggregatable metric models
  • monitoring, alerting, capacity observation, and regression diagnosis

Overview ​

Why Metrics ​

Metrics are well suited to answer questions like:

  • Has HTTP traffic increased abnormally over the last few minutes?
  • Are resource ingestion, retrieval, or model calls getting slower?
  • Is there queue backlog?
  • Are key dependencies such as storage, model providers, VikingDB, encryption, and async systems currently healthy?
  • Is a specific tenant showing abnormal traffic or error rates?

Compared with logs and observer snapshots, metrics are better for:

  • continuous scraping
  • time-series aggregation
  • dashboard visualization
  • alert rules

How Metrics Differ from Observer and Stats ​

CapabilityBest ForOutput FormatTypical Usage
/metricsonline monitoring, alerting, trend aggregationPrometheus exposition textGrafana dashboards, Prometheus scraping
/api/v1/observer/*human inspection of component snapshotsJSON / status tablesdebugging, health checks
/api/v1/stats/*analytics-oriented statisticsJSONmemory health, staleness, session extraction

The boundary is:

  • /metrics only carries low-cardinality, low-cost metrics
  • /api/v1/stats/* continues to carry analytics-oriented statistics without being constrained by the Prometheus scraping model

Metrics Architecture ​

The current metrics stack in OpenViking has four layers:

text
Business logic / HTTP requests / background tasks
          │
          ▼
      DataSource
   (event emission / state reads)
          │
          ▼
      Collector
 (semantic routing + labels)
          │
          ▼
    MetricRegistry
   (in-process metric store)
          │
          ▼
      Exporter
 (Prometheus text rendering)
          │
          ▼
       /metrics

DataSource ​

DataSources provide inputs to the metrics system in two main forms:

  • Event-based: business code emits events at key points, such as retrieval completion, successful model calls, or resource ingestion stage completion
  • Read-based: current state is read before /metrics export, such as queue state, lock state, or probe state

Collector ​

Collectors turn inputs into metric semantics:

  • choose which metric to write
  • choose which labels to attach
  • define how failure is exposed, such as valid=1/0

MetricRegistry ​

The MetricRegistry is the in-process metric store that keeps the current metric values and serves them to the exporter.

Exporter ​

The first exporter implementation is the Prometheus exporter, which renders registry contents into Prometheus exposition text.

Usage ​

Accessing /metrics ​

/metrics does not require an OpenViking API key. Restrict access at the gateway or reverse proxy when needed.

bash
curl http://localhost:1933/metrics

If your deployment protects /metrics at the gateway, reverse proxy, or service discovery layer, attach auth according to the deployment environment.

Prometheus Scrape Example ​

yaml
scrape_configs:
  - job_name: openviking
    metrics_path: /metrics
    static_configs:
      - targets: ["localhost:1933"]

Understanding Common Labels ​

LabelMeaningExample
account_idtenant dimension labeltest-account, __unknown__, __overflow__
routeHTTP route template/api/v1/search/find
methodHTTP methodGET, POST
statusrequest or stage status200, ok, error
operationstructured operation namesearch.find, resources.add_resource
context_typeretrieval context typeresource
providermodel or external service providervolcengine
model_namemodel namedoubao-seed-1-8-251228
stagestage label (defined by each metric family)resource stage: parse_artifact; token attribution stage: embed_query
validwhether the current sample is fresh and valid1 / 0

Notes:

  • account_id is only enabled on controlled allowlisted metric families to prevent high-cardinality growth
  • valid=0 means the current state/probe sample is a fallback or stale value, not that the label itself is malformed
  • stage semantics depend on the metric family:
    • openviking_resource_stage_*: resource ingestion pipeline stages (for example parse_artifact/target_resolve/content_commit)
    • openviking_operation_tokens_total: token attribution stages (for example embed_query/rerank/vlm)

Key Metric Families ​

The tables list representative metrics defined by the collectors. A series appears only when its feature is enabled, the relevant event occurs, and collection succeeds. An absent series does not necessarily mean zero.

Requests and Operations ​

Metric FamilyTypeCommon LabelsMeaning
openviking_http_requests_totalCounteraccount_id, method, route, statustotal HTTP requests
openviking_http_request_duration_secondsHistogramaccount_id, method, route, statusHTTP latency distribution
openviking_http_inflight_requestsGaugeaccount_id, routecurrent inflight requests (in-process approximation)
openviking_operation_requests_totalCounteraccount_id, operation, statustotal structured operations
openviking_operation_duration_secondsHistogramaccount_id, operation, statusstructured operation duration distribution

Typical usage:

  • inspect whether /api/v1/search/find or /api/v1/resources is slowing down
  • inspect whether a specific operation has elevated error rates

Retrieval and Resource Processing ​

Metric FamilyTypeCommon LabelsMeaning
openviking_retrieval_requests_totalCounteraccount_id, context_typeretrieval request count
openviking_retrieval_results_totalCounteraccount_id, context_typetotal retrieved results
openviking_retrieval_latency_secondsHistogramaccount_id, context_typeretrieval latency distribution
openviking_retrieval_zero_result_totalCounteraccount_id, context_typeretrieval zero-result count
openviking_retrieval_rerank_used_totalCounteraccount_idnumber of retrievals that used rerank
openviking_retrieval_rerank_fallback_totalCounteraccount_idretrieval rerank fallback count
openviking_resource_imports_totalCounteraccount_id, pipeline, source_typeaccepted resource import tasks; Connector imports use pipeline="connector" and source_type="repository" or "document"
openviking_resource_stage_totalCounteraccount_id, stage, statuscount of resource ingestion stages
openviking_resource_stage_duration_secondsHistogramaccount_id, stage, statusduration distribution of ingestion stages
openviking_resource_wait_duration_secondsHistogramaccount_id, operationresource ingestion wait duration distribution (for example queue waiting)

Current built-in resource event producers emit these stage values, depending on the path taken:

  • source_prepare
  • parse_artifact
  • target_resolve
  • update_plan
  • content_commit
  • derived_enqueue
  • semantic_queue_wait
  • semantic_execute
  • embedding_queue_wait
  • embedding_execute

The telemetry bridge also recognizes legacy summary keys for request, process, parse, finalize, summarize, wait, and watch. The current resource summary builder does not produce those keys, so they are not additional stages emitted by the current import pipeline. persist is not in that bridge map.

Vector, Memory, and Semantic Metrics ​

Metric FamilyTypeCommon LabelsMeaning
openviking_vector_searches_totalCounteroperationvector search count
openviking_vector_scored_totalCounteroperationtotal scored candidates
openviking_vector_passed_totalCounteroperationtotal passed candidates
openviking_vector_returned_totalCounteroperationtotal returned candidates
openviking_vector_scanned_totalCounteroperationtotal scanned candidates
openviking_memory_extracted_totalCounteroperation, memory_typetotal extracted memory items, split by memory schema type
openviking_semantic_nodes_totalCounterstatustotal semantic nodes

Model Calls and Tokens ​

Metric FamilyTypeCommon LabelsMeaning
openviking_model_calls_totalCountermodel_type, provider, model_nameunified model call count
openviking_model_tokens_totalCountermodel_type, provider, model_name, token_typeunified model token count
openviking_vlm_calls_totalCounteraccount_id, provider, model_nameVLM call count
openviking_vlm_tokens_input_totalCounteraccount_id, provider, model_nameVLM input tokens
openviking_vlm_tokens_output_totalCounteraccount_id, provider, model_nameVLM output tokens
openviking_vlm_tokens_totalCounteraccount_id, provider, model_nameVLM total tokens
openviking_vlm_ingestion_tokens_totalCounteraccount_id, source_typeVLM total tokens during resource ingestion; source_type is repository or document
openviking_vlm_call_duration_secondsHistogramaccount_id, provider, model_nameVLM call duration distribution
openviking_embedding_requests_totalCounteraccount_id, statusembedding request count
openviking_embedding_latency_secondsHistogramaccount_id, statusembedding latency distribution
openviking_embedding_errors_totalCounteraccount_id, error_codeembedding error count
openviking_embedding_calls_totalCounteraccount_id, provider, model_nameembedding provider call count (per-call)
openviking_embedding_call_duration_secondsHistogramaccount_id, provider, model_nameembedding provider call duration distribution (per-call)
openviking_embedding_tokens_input_totalCounteraccount_id, provider, model_nameembedding input tokens (per-call aggregate)
openviking_embedding_tokens_output_totalCounteraccount_id, provider, model_nameembedding output tokens (per-call aggregate; may not appear if always 0)
openviking_embedding_tokens_totalCounteraccount_id, provider, model_nameembedding total tokens (per-call aggregate)
openviking_embedding_ingestion_tokens_totalCounteraccount_id, source_typeembedding total tokens during resource ingestion; source_type is repository or document
openviking_rerank_calls_totalCounteraccount_id, provider, model_namererank provider call count (per-call)
openviking_rerank_call_duration_secondsHistogramaccount_id, provider, model_namererank provider call duration distribution (per-call)
openviking_rerank_tokens_input_totalCounteraccount_id, provider, model_namererank input tokens (per-call aggregate)
openviking_rerank_tokens_output_totalCounteraccount_id, provider, model_namererank output tokens (per-call aggregate; may not appear if always 0)
openviking_rerank_tokens_totalCounteraccount_id, provider, model_namererank total tokens (per-call aggregate)
openviking_operation_tokens_totalCounteraccount_id, operation, stage, token_typeoperation token aggregation (token attribution stages)

Notes:

  • openviking_model_* gives a unified cross-model view for embedding and VLM usage
  • openviking_vlm_* and openviking_embedding_* are better suited for workload-specific dashboards
  • *_requests_* represents business requests; *_calls_*, call duration, and token families represent provider calls
  • openviking_operation_tokens_total has no pre-aggregated token_type="all/total"; aggregate totals in TSDB queries

Queues, Locks, and Runtime State ​

Metric FamilyTypeCommon LabelsMeaning
openviking_queue_processed_totalCounterqueuetotal processed items per queue
openviking_queue_errors_totalCounterqueuetotal error count per queue
openviking_queue_pendingGaugequeuepending queue items
openviking_queue_in_progressGaugequeuein-progress queue items
openviking_queue_process_duration_secondsHistogramqueue, outcomehandler execution time after a worker dequeues a message
openviking_queue_end_to_end_duration_secondsHistogramqueue, outcomeenqueue-to-handler-completion latency, including queue wait time
openviking_executor_max_workersGaugepool, process_role, workermaximum workers in the asyncio default executor
openviking_executor_threadsGaugepool, process_role, workerthreads created by the asyncio default executor
openviking_executor_active_tasksGaugepool, process_role, workerdefault executor tasks currently running
openviking_executor_pending_tasksGaugepool, process_role, workerdefault executor tasks waiting to run
openviking_executor_submitted_totalCounterpool, process_role, workertotal tasks submitted to the default executor
openviking_executor_completed_totalCounterpool, process_role, workerdefault executor tasks that finished, including failed tasks
openviking_executor_failed_totalCounterpool, process_role, workerdefault executor callables that raised exceptions
openviking_lock_activeGaugenonecurrent published lock leases
openviking_lock_waitingGaugenonerequests currently waiting for locks
openviking_lock_staleGaugenonecumulative count of stale lock tokens removed
openviking_lock_conflicts_totalCounternoneobserved lock conflicts
openviking_lock_stale_leases_released_totalCounternonestale leases released
openviking_lock_descendant_scans_totalCounternonecompleted descendant scans
openviking_lock_descendant_scan_duration_seconds_totalCounternonecumulative descendant scan duration

The queue duration outcome label is one of success, failed, requeued, cancelled, or exception. failed means the handler returned a settled failure that can be acknowledged, while exception means processing raised and the current message is left unacknowledged.

These help answer:

  • Is there queue backlog?
  • Which queue is slow, and is the latency caused by waiting or processing?
  • Is there lock contention or stale locking?
  • Is the default executor near its worker limit or building a queue?

Executor metrics only cover loop.run_in_executor(None, ...) and asyncio.to_thread(...). Calls using an explicit custom executor and Rust / RAGFS internal runtimes or threads are not included. failed_total counts callables that raise exceptions. If the caller catches that exception and treats it as a normal branch, it still counts here, so this is not the business request failure count.

RAGFS ​

RAGFS exports filesystem, cache, multi-backend and lock metrics through one native metrics() call. The collector replaces Registry values directly without computing deltas. Durations are sampled in integer nanoseconds and exported as fractional seconds, for example 123 ns = 0.000000123 seconds.

Metric FamilyTypeCommon LabelsMeaning
openviking_ragfs_operation_results_totalCounterplugin, operation, statussuccessful and failed operations
openviking_ragfs_operation_duration_secondsHistogramplugin, operationoperation duration distribution
openviking_ragfs_cache_requests_totalCounterkind, resultfile/directory cache hits and misses
openviking_ragfs_cache_backend_fallbacks_totalCounternonebackend loads after cache misses
openviking_ragfs_cache_operations_totalCounteroperationcache put/delete attempts
openviking_ragfs_cache_invalidations_totalCounternonecompleted invalidations
openviking_ragfs_cache_errors_totalCounternonecache errors hidden by bypass mode
openviking_ragfs_cache_policy_bypasses_totalCounternonereads bypassing cache
openviking_ragfs_cache_bytes_totalCountersourcebytes from backend/cache
openviking_ragfs_cache_operation_duration_seconds_totalCounteroperationcumulative get/put/delete duration
openviking_ragfs_cache_inflight_events_totalCountereventleader/follower/backend_saved counts
openviking_ragfs_multiwrite_background_tasksGaugenoneactive flush runtime, 0 or 1 per mount
openviking_ragfs_multiwrite_pending_eventsGaugenonesubmitted events that are queued, executing, or awaiting retry
openviking_ragfs_multiwrite_errors_totalCounterworkerfinal failures for flush, checkpoint, catch_up, or gc
openviking_ragfs_multiwrite_backend_lag_eventsGaugebackend, partitionsum of tail - synced_seq across accounts
openviking_ragfs_multiwrite_protocol_versionGaugeversionmount count for the closed label v2
openviking_ragfs_multiwrite_protocol_statusGaugestatusmount count for closed labels migrating and stable

These metrics have no mount or account_id label. Cache and multi-backend families are absent when those capabilities are not enabled. status is success or error; exists=false is successful and replace uses rename. Histogram buckets cover all outcomes, with finite bounds from 0.0001 to 10 seconds. Python get_stats() retains its microsecond fields.

The protocol family always contains both closed-label series. One unreadable or invalid protocol, account, or segment manifest rejects the whole scrape snapshot instead of publishing partial zero lag.

Tasks and Task Tracker ​

Metric FamilyTypeCommon LabelsMeaning
openviking_task_pendingGaugetask_typepending tasks tracked by task tracker
openviking_task_runningGaugetask_typerunning tasks tracked by task tracker
openviking_task_completedGaugetask_typecompleted tasks tracked by task tracker
openviking_task_failedGaugetask_typefailed tasks tracked by task tracker
openviking_task_cancellingGaugetask_typetasks being cancelled
openviking_task_cancelledGaugetask_typecancelled tasks

Cache ​

Metric FamilyTypeCommon LabelsMeaning
openviking_cache_hits_totalCounterlevelcache hit count
openviking_cache_misses_totalCounterlevelcache miss count

Session ​

Metric FamilyTypeCommon LabelsMeaning
openviking_session_lifecycle_totalCounteraccount_id, action, statussession lifecycle event count
openviking_session_archive_totalCounteraccount_id, statussession archive count

Feedback ​

These metrics summarize persisted VikingBot feedback and outcome data at scrape time. They are exported as gauges because the collector recomputes the current aggregate snapshot from bot session files instead of incrementing counters online.

Metric FamilyTypeCommon LabelsMeaning
openviking_feedback_sessions_scanned_totalGaugevalidnumber of bot sessions scanned for the current snapshot
openviking_feedback_responses_totalGaugevalidtotal persisted assistant responses included in the snapshot, including legacy responses outside the new observability contract
openviking_feedback_tracked_responses_totalGaugevalidresponses covered by the current feedback observability contract (metadata.feedback_events or metadata.response_outcomes)
openviking_feedback_responses_with_feedback_totalGaugevalidresponses that have at least one explicit feedback event
openviking_feedback_events_totalGaugevalidexplicit feedback event count
openviking_feedback_thumb_up_totalGaugevalidthumb-up event count
openviking_feedback_thumb_down_totalGaugevalidthumb-down event count
openviking_feedback_positive_outcomes_totalGaugevalidresponses classified as positive feedback outcomes
openviking_feedback_negative_outcomes_totalGaugevalidresponses classified as negative feedback outcomes
openviking_feedback_reasked_outcomes_totalGaugevalidresponses classified as reasked outcomes
openviking_feedback_resolved_outcomes_totalGaugevalidresponses classified as resolved outcomes
openviking_feedback_follow_up_without_feedback_outcomes_totalGaugevalidresponses followed up without explicit feedback
openviking_feedback_coverageGaugevalidfraction of tracked responses with explicit feedback
openviking_feedback_thumbs_up_rateGaugevalidfraction of feedback events that are thumbs up
openviking_feedback_thumbs_down_rateGaugevalidfraction of feedback events that are thumbs down
openviking_feedback_positive_feedback_rateGaugevalidfraction of tracked responses with positive feedback outcomes
openviking_feedback_negative_feedback_rateGaugevalidfraction of tracked responses with negative feedback outcomes
openviking_feedback_reask_rateGaugevalidfraction of tracked responses that led to reasking
openviking_feedback_one_turn_resolution_rateGaugevalidfraction of tracked responses resolved in one turn
openviking_feedback_channel_*Gaugechannel, validper-channel variants of response volume, feedback volume, negative outcomes, reasks, coverage, thumb rates, and one-turn resolution

For mixed historical data, use openviking_feedback_tracked_responses_total as the denominator reference for rate panels. openviking_feedback_responses_total is kept to show overall persisted assistant-response volume, including legacy responses that predate the current feedback metadata contract.

Typical usage:

  • build Grafana panels for feedback coverage, thumbs-down rate, and one-turn resolution rate over time
  • compare feedback quality across channels such as cli__default and bot_api__demo
  • alert when valid="0" appears persistently, which indicates the collector is serving the last successful snapshot after a refresh failure

PromQL / Grafana examples:

  • overall feedback coverage:
promql
openviking_feedback_coverage{valid="1"}
  • overall thumbs-down rate:
promql
openviking_feedback_thumbs_down_rate{valid="1"}
  • one-turn resolution rate:
promql
openviking_feedback_one_turn_resolution_rate{valid="1"}
  • per-channel coverage and resolution comparison:
promql
openviking_feedback_channel_coverage{valid="1"}
promql
openviking_feedback_channel_one_turn_resolution_rate{valid="1"}
  • detect fallback snapshots:
promql
max by (job) (openviking_feedback_events_total{valid="0"})

Because these are scrape-time snapshot gauges, they work well in Grafana time-series panels and side-by-side channel comparison panels.

For /metrics endpoint behavior and scrape usage, see Metrics API.

Probes and Health State ​

Metric FamilyTypeCommon LabelsMeaning
openviking_service_readinessGaugemay include validmain service readiness
openviking_api_key_manager_readinessGaugemay include validAPI key manager readiness
openviking_storage_readinessGaugeprobe, validstorage probe, for example agfs
openviking_model_provider_readinessGaugeprovider, validwhether a VLM client can be created from configuration; no model request is sent
openviking_async_system_readinessGaugeprobe, validasync system readiness
openviking_retrieval_backend_readinessGaugeprobe, validretrieval backend readiness
openviking_encryption_component_healthGaugevalidoverall encryption component health
openviking_encryption_root_key_readyGaugevalidwhether the root key is ready
openviking_encryption_kms_provider_readyGaugeprovider, validKMS provider readiness

Meaning of valid:

  • valid="1": the sample was produced by a successful refresh
  • valid="0": the sample is a fallback or stale value and should be treated with caution

Encryption (Operational Metrics) ​

These metrics are driven by Python encryption events and are not complete counts of all encrypted RAGFS file I/O. Assess file throughput together with RAGFS metrics and the enabled backends.

Metric FamilyTypeCommon LabelsMeaning
openviking_encryption_operations_totalCounteraccount_id, operation, statusencrypt/decrypt operation count
openviking_encryption_duration_secondsHistogramaccount_id, operation, statusencrypt/decrypt duration distribution
openviking_encryption_bytes_totalCounteraccount_id, operationencrypt/decrypt processed bytes total
openviking_encryption_payload_size_bytesHistogramaccount_id, operationencrypt/decrypt payload size distribution
openviking_encryption_auth_failed_totalCounteraccount_id, statusauth-failed count
openviking_encryption_key_derivation_totalCounteraccount_id, statuskey derivation count
openviking_encryption_key_derivation_duration_secondsHistogramaccount_id, statuskey derivation duration distribution
openviking_encryption_key_load_duration_secondsHistogramaccount_id, status, providerkey load duration distribution
openviking_encryption_key_cache_hits_totalCounteraccount_id, providerkey cache hit count
openviking_encryption_key_cache_misses_totalCounteraccount_id, providerkey cache miss count
openviking_encryption_key_version_usage_totalCounteraccount_id, key_versionkey version usage count

Component and Observer Aggregate Metrics ​

Metric FamilyTypeCommon LabelsMeaning
openviking_component_healthGaugecomponent, validcomponent health state
openviking_component_errorsGaugecomponent, validcomponent error state
openviking_observer_components_totalGaugevalidnumber of observed components
openviking_observer_components_unhealthyGaugevalidnumber of unhealthy components
openviking_observer_components_with_errorsGaugevalidnumber of components with errors

Typical component values include:

  • queue
  • models
  • lock
  • retrieval
  • vikingdb
  • filesystem

VikingDB and Model Usage Statistics ​

Metric FamilyTypeCommon LabelsMeaning
openviking_vikingdb_collection_healthGaugecollection, validcollection health
openviking_vikingdb_collection_vectorsGaugecollection, validcurrent vector count per collection
openviking_model_usage_availableGaugemodel_type, validwhether model usage statistics are currently available

Possible model_type values include:

  • vlm
  • embedding
  • rerank

openviking_model_provider_readiness=1 does not verify credentials, quota, or remote inference. It only checks client construction. Use actual model-call errors and latency to assess requests.

Configuration Example ​

Enabling Metrics ​

In ov.conf, the metrics subsystem can be explicitly enabled through server.observability.metrics:

json
{
  "server": {
    "observability": {
      "metrics": {
        "enabled": true,
        "account_dimension": {
          "enabled": true,
          "max_active_accounts": 100,
          "metric_allowlist": [
            "openviking_http_requests_total",
            "openviking_http_request_duration_seconds",
            "openviking_http_inflight_requests",
            "openviking_operation_requests_total",
            "openviking_operation_duration_seconds",
            "openviking_vlm_calls_total",
            "openviking_vlm_call_duration_seconds",
            "openviking_rerank_*"
          ]
        }
      }
    }
  }
}

Recommended mental model:

  • server.observability.metrics.enabled: master switch for the metrics subsystem
  • server.observability.metrics.account_dimension: controls whether account_id labels are enabled and where they are allowed

Exporters ​

By default, OpenViking exports metrics via Prometheus exposition format at /metrics. You can also enable additional exporters under server.observability.metrics.exporters.

Key fields:

  • server.observability.metrics.exporters.prometheus.enabled: enable the Prometheus exporter (serves /metrics)
  • server.observability.metrics.exporters.otel.enabled: enable OTLP export from the same in-process registry
  • server.observability.metrics.exporters.otel.protocol: "grpc" or "http"
  • server.observability.metrics.exporters.otel.tls.insecure: OTLP/gRPC only; true means plaintext (no TLS)
  • server.observability.metrics.exporters.otel.endpoint: OTLP endpoint (for gRPC, use host:4317; for HTTP, use a full URL)
  • server.observability.metrics.exporters.otel.service_name: OTLP service.name resource attribute; defaults to top-level service_name when omitted
  • server.observability.metrics.exporters.otel.export_interval_ms: OTLP push interval in milliseconds (default 10000)
  • server.observability.metrics.exporters.otel.headers: optional custom OTLP headers; sent as gRPC metadata for gRPC and HTTP headers for HTTP
  • When using gRPC, header keys in headers should be lowercase, for example x-byteapm-appkey; HTTP does not have this restriction

Example:

json
{
  "server": {
    "observability": {
      "metrics": {
        "enabled": true,
        "exporters": {
          "prometheus": {
            "enabled": true
          },
          "otel": {
            "enabled": true,
            "protocol": "grpc",
            "tls": {
              "insecure": true
            },
            "endpoint": "otel-collector:4317",
            "service_name": "openviking-server",
            "export_interval_ms": 10000,
            "headers": {}
          }
        }
      }
    }
  }
}
  • enabled by default, but only allowlisted metric families will receive tenant ids (empty allowlist still yields __unknown__)
  • do not turn user_id, session_id, or resource_uri into labels
  • only enable tenant dimensions on a small set of critical dashboard and alert metrics
  • metric_allowlist supports a limited wildcard syntax: only trailing * prefix matches (e.g. openviking_rerank_*, openviking_embedding_*)
  • a standalone * is not supported, nor full glob/regex patterns

Open source under the AGPL-3.0 License. Font licenses