Implementation:SeldonIO Seldon core Hodometer Collect
| Knowledge Sources | |
|---|---|
| Domains | Observability, Metrics_Collection, Usage_Telemetry |
| Last Updated | 2026-02-13 14:00 GMT |
Overview
Concrete tool for collecting usage metrics from Seldon Core 2 scheduler and Kubernetes cluster provided by the Hodometer package.
Description
The SeldonCoreCollector struct implements the Collector interface and gathers usage metrics by concurrently querying the Seldon Core 2 scheduler gRPC API and the Kubernetes API. It collects Kubernetes version information, scheduler version, and counts of active experiments, pipelines, servers (with replica and memory details), and models. Metrics are tiered by MetricsLevel (cluster, resource, feature) so that different levels of detail can be gathered depending on configuration.
The collector establishes a gRPC connection to the scheduler with configurable TLS support and retry logic via exponential backoff. It also creates a Kubernetes clientset from in-cluster config for querying the K8s API server.
Usage
Use this collector when running the Hodometer component to periodically gather anonymous usage telemetry about a Seldon Core 2 deployment. The collector is instantiated once at startup and invoked on each collection cycle by the Punctuator.
Code Reference
Source Location
- Repository: SeldonIO_Seldon_core
- File: hodometer/pkg/hodometer/collect.go
- Lines: 1-449
Signature
type Collector interface {
Collect(ctx context.Context, level MetricsLevel) *UsageMetrics
}
type SeldonCoreCollector struct {
schedulerClient scheduler.SchedulerClient
k8sClient kubernetes.Interface
logger logrus.FieldLogger
clusterId string
certificateStore *seldontls.CertificateStore
}
func NewSeldonCoreCollector(
logger logrus.FieldLogger,
schedulerHost string,
schedulerPlaintxtPort uint,
schedulerTlsPort uint,
clusterId string,
tlsOptions *seldontls.TLSOptions,
) (*SeldonCoreCollector, error)
func (scc *SeldonCoreCollector) Collect(
ctx context.Context,
level MetricsLevel,
) *UsageMetrics
Import
import "github.com/seldonio/seldon-core/hodometer/pkg/hodometer"
I/O Contract
Inputs
| Name | Type | Required | Description |
|---|---|---|---|
| logger | logrus.FieldLogger | Yes | Structured logger for operational output |
| schedulerHost | string | Yes | Hostname of the Seldon Core scheduler gRPC endpoint |
| schedulerPlaintxtPort | uint | Yes | Plain-text gRPC port for the scheduler |
| schedulerTlsPort | uint | Yes | TLS gRPC port for the scheduler |
| clusterId | string | Yes | UUID identifying the cluster (auto-generated if invalid) |
| tlsOptions | *seldontls.TLSOptions | Yes | TLS configuration (nil cert means plaintext) |
| ctx | context.Context | Yes | Context for cancellation and timeouts during collection |
| level | MetricsLevel | Yes | Granularity level for collected metrics (cluster, resource, feature) |
Outputs
| Name | Type | Description |
|---|---|---|
| *UsageMetrics | *hodometer.UsageMetrics | Aggregated usage metrics struct containing cluster, resource, and feature metrics |
| error | error | Returned by NewSeldonCoreCollector if gRPC connection fails |
Usage Examples
Creating and Using a Collector
package main
import (
"context"
"github.com/sirupsen/logrus"
"github.com/seldonio/seldon-core/hodometer/pkg/hodometer"
seldontls "github.com/seldonio/seldon-core/components/tls/v2/pkg/tls"
)
func main() {
logger := logrus.New()
tlsOpts := &seldontls.TLSOptions{} // plaintext mode
collector, err := hodometer.NewSeldonCoreCollector(
logger,
"seldon-scheduler", // schedulerHost
9004, // schedulerPlaintxtPort
9044, // schedulerTlsPort
"", // clusterId (auto-generated)
tlsOpts,
)
if err != nil {
logger.Fatalf("failed to create collector: %v", err)
}
ctx := context.Background()
metrics := collector.Collect(ctx, hodometer.MetricsLevelFeature)
logger.Infof("Cluster: %s, Models: %d, Pipelines: %d",
metrics.ClusterId,
metrics.ResourceMetrics.ModelCount,
metrics.ResourceMetrics.PipelineCount,
)
}