diff --git a/cmd/wfctl/type_registry.go b/cmd/wfctl/type_registry.go index 3e46079b..c1943f30 100644 --- a/cmd/wfctl/type_registry.go +++ b/cmd/wfctl/type_registry.go @@ -275,7 +275,7 @@ func KnownModuleTypes() map[string]ModuleTypeInfo { Type: "metrics.collector", Plugin: "observability", Stateful: false, - ConfigKeys: []string{"namespace", "subsystem", "metricsPath", "enabledMetrics"}, + ConfigKeys: []string{"namespace", "subsystem", "enabledMetrics"}, }, "observability.telemetry": { Type: "observability.telemetry", diff --git a/data/registry/plugins/http/manifest.json b/data/registry/plugins/http/manifest.json index 30412269..e158a49c 100644 --- a/data/registry/plugins/http/manifest.json +++ b/data/registry/plugins/http/manifest.json @@ -37,10 +37,7 @@ "wiringHooks": [ "http-auth-provider-wiring", "http-static-fileserver-registration", - "http-health-endpoint-registration", - "http-metrics-endpoint-registration", - "http-log-endpoint-registration", - "http-openapi-endpoint-registration" + "http-cors-global-wiring" ] } } diff --git a/data/registry/plugins/observability/manifest.json b/data/registry/plugins/observability/manifest.json index 9c1924c0..0db14f65 100644 --- a/data/registry/plugins/observability/manifest.json +++ b/data/registry/plugins/observability/manifest.json @@ -18,16 +18,19 @@ "health.checker", "log.collector", "observability.otel", - "openapi.generator" + "openapi.generator", + "http.middleware.otel", + "tracing.propagation" ], "stepTypes": [], "triggerTypes": [], "workflowHandlers": [], "wiringHooks": [ + "observability.otel-middleware", "observability.health-endpoints", - "observability.metrics-endpoint", "observability.log-endpoint", - "observability.openapi-endpoints" + "observability.openapi-endpoints", + "observability.telemetry-bridge" ] } } diff --git a/deploy/README.md b/deploy/README.md index 8f2b1af9..8f1ca136 100644 --- a/deploy/README.md +++ b/deploy/README.md @@ -169,7 +169,6 @@ helm upgrade --install workflow ./deploy/helm/workflow \ | `podDisruptionBudget.minAvailable` | 1 | Min available pods | | `ingress.enabled` | false | Enable Ingress | | `ingress.className` | "" | Ingress class (e.g., nginx, alb) | -| `monitoring.serviceMonitor.enabled` | false | Enable Prometheus ServiceMonitor | | `envFromSecret` | "" | Name of K8s Secret for env vars | ### Production Helm values example @@ -212,13 +211,6 @@ resources: cpu: 2000m memory: 2Gi -monitoring: - enabled: true - serviceMonitor: - enabled: true - labels: - prometheus: kube-prometheus - envFromSecret: workflow-secrets ``` diff --git a/deploy/docker-compose/prometheus.yml b/deploy/docker-compose/prometheus.yml index 863090a1..68c689c9 100644 --- a/deploy/docker-compose/prometheus.yml +++ b/deploy/docker-compose/prometheus.yml @@ -3,11 +3,6 @@ global: evaluation_interval: 15s scrape_configs: - - job_name: "workflow-server" - static_configs: - - targets: ["workflow-server:8081"] - metrics_path: /metrics - - job_name: "prometheus" static_configs: - targets: ["localhost:9090"] diff --git a/deploy/helm/workflow/templates/servicemonitor.yaml b/deploy/helm/workflow/templates/servicemonitor.yaml deleted file mode 100644 index a0803209..00000000 --- a/deploy/helm/workflow/templates/servicemonitor.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- if and .Values.monitoring.enabled .Values.monitoring.serviceMonitor.enabled }} -apiVersion: monitoring.coreos.com/v1 -kind: ServiceMonitor -metadata: - name: {{ include "workflow.fullname" . }} - labels: - {{- include "workflow.labels" . | nindent 4 }} - {{- with .Values.monitoring.serviceMonitor.labels }} - {{- toYaml . | nindent 4 }} - {{- end }} -spec: - selector: - matchLabels: - {{- include "workflow.selectorLabels" . | nindent 6 }} - endpoints: - - port: mgmt - interval: {{ .Values.monitoring.serviceMonitor.interval }} - path: /metrics -{{- end }} diff --git a/deploy/helm/workflow/values.yaml b/deploy/helm/workflow/values.yaml index ce4e7b00..bb875045 100644 --- a/deploy/helm/workflow/values.yaml +++ b/deploy/helm/workflow/values.yaml @@ -101,11 +101,3 @@ persistence: storageClass: "" accessMode: ReadWriteOnce size: 1Gi - -# Prometheus monitoring -monitoring: - enabled: false - serviceMonitor: - enabled: false - interval: 30s - labels: {} diff --git a/docs/openapi.yaml b/docs/openapi.yaml index 8f614a22..bf4ab78b 100644 --- a/docs/openapi.yaml +++ b/docs/openapi.yaml @@ -26,8 +26,6 @@ servers: tags: - name: Health description: Health check and readiness probes - - name: Metrics - description: Prometheus metrics - name: Auth description: JWT authentication (login, register, profile) - name: Affiliates @@ -766,27 +764,6 @@ paths: schema: $ref: '#/components/schemas/LiveResponse' - # ─── Metrics (port 8080) ─────────────────────────────────────────── - /metrics: - get: - tags: [Metrics] - summary: Prometheus metrics - description: | - Prometheus-format metrics endpoint. Available metrics: - - `workflow_executions_total` (counter) - - `workflow_duration_seconds` (histogram) - - `http_requests_total` (counter) - - `http_request_duration_seconds` (histogram) - - `module_operations_total` (counter) - - `active_workflows` (gauge) - responses: - '200': - description: Prometheus exposition format - content: - text/plain: - schema: - type: string - # ─── Auth (port 8080) ───────────────────────────────────────────── /api/auth/login: post: diff --git a/e2e_execution_test.go b/e2e_execution_test.go index 5774f142..1acaaa8c 100644 --- a/e2e_execution_test.go +++ b/e2e_execution_test.go @@ -19,6 +19,7 @@ import ( "github.com/GoCodeAlone/workflow/dynamic" "github.com/GoCodeAlone/workflow/handlers" "github.com/GoCodeAlone/workflow/module" + dto "github.com/prometheus/client_model/go" ) // getFreePort returns an available TCP port for test servers. @@ -2462,26 +2463,18 @@ func TestE2E_MetricsAndHealthCheck(t *testing.T) { mc.SetActiveWorkflows("test-workflow", 5) mc.RecordModuleOperation("mh-handler", "handle", "success") - // Verify the Prometheus handler serves metrics - metricsHandler := mc.Handler() - if metricsHandler == nil { - t.Fatal("MetricsCollector.Handler() returned nil") + metricFamilies, err := mc.Gather() + if err != nil { + t.Fatalf("Gather metrics failed: %v", err) } - - // Serve metrics via a test HTTP recorder - rec := &testResponseRecorder{headers: make(http.Header), body: &bytes.Buffer{}} - metricsReq, _ := http.NewRequest("GET", "/metrics", nil) - metricsHandler.ServeHTTP(rec, metricsReq) - - metricsBody := rec.body.String() - if !strings.Contains(metricsBody, "workflow_executions_total") { - t.Error("Metrics output missing workflow_executions_total") + if !metricFamilyExists(metricFamilies, "workflow_workflow_executions_total") { + t.Error("Metrics output missing workflow_workflow_executions_total") } - if !strings.Contains(metricsBody, "http_requests_total") { - t.Error("Metrics output missing http_requests_total") + if !metricFamilyExists(metricFamilies, "workflow_http_requests_total") { + t.Error("Metrics output missing workflow_http_requests_total") } - if !strings.Contains(metricsBody, "active_workflows") { - t.Error("Metrics output missing active_workflows") + if !metricFamilyExists(metricFamilies, "workflow_active_workflows") { + t.Error("Metrics output missing workflow_active_workflows") } t.Log(" Prometheus metrics contain expected counters") @@ -3006,6 +2999,15 @@ type testResponseRecorder struct { body *bytes.Buffer } +func metricFamilyExists(families []*dto.MetricFamily, name string) bool { + for _, family := range families { + if family.GetName() == name { + return true + } + } + return false +} + func (r *testResponseRecorder) Header() http.Header { return r.headers } diff --git a/go.mod b/go.mod index cfe3514a..6b584b8c 100644 --- a/go.mod +++ b/go.mod @@ -35,6 +35,7 @@ require ( github.com/mattn/go-isatty v0.0.22 github.com/nats-io/nats.go v1.52.0 github.com/prometheus/client_golang v1.23.2 + github.com/prometheus/client_model v0.6.2 github.com/redis/go-redis/v9 v9.19.0 github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 github.com/stretchr/testify v1.11.1 @@ -218,7 +219,6 @@ require ( github.com/pierrec/lz4/v4 v4.1.26 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.67.5 // indirect github.com/prometheus/procfs v0.20.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 // indirect diff --git a/module/metrics.go b/module/metrics.go index 46977107..66937b45 100644 --- a/module/metrics.go +++ b/module/metrics.go @@ -1,20 +1,18 @@ package module import ( - "net/http" "strconv" "time" "github.com/GoCodeAlone/modular" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promhttp" + dto "github.com/prometheus/client_model/go" ) // MetricsCollectorConfig holds configuration for the MetricsCollector module. type MetricsCollectorConfig struct { Namespace string `yaml:"namespace" json:"namespace" editor:"type=string,description=Prometheus metric namespace prefix,default=workflow,placeholder=workflow"` Subsystem string `yaml:"subsystem" json:"subsystem" editor:"type=string,description=Prometheus metric subsystem,placeholder=api"` - MetricsPath string `yaml:"metricsPath" json:"metricsPath" editor:"type=string,description=Endpoint path for Prometheus scraping,default=/metrics,placeholder=/metrics"` EnabledMetrics []string `yaml:"enabledMetrics" json:"enabledMetrics" editor:"type=array,arrayItemType=string,description=Which metric groups to register (workflow http module active_workflows)"` } @@ -23,7 +21,6 @@ func DefaultMetricsCollectorConfig() MetricsCollectorConfig { return MetricsCollectorConfig{ Namespace: "workflow", Subsystem: "", - MetricsPath: "/metrics", EnabledMetrics: []string{"workflow", "http", "module", "active_workflows"}, } } @@ -135,9 +132,6 @@ func NewMetricsCollectorWithConfig(name string, cfg MetricsCollectorConfig) *Met return mc } -// MetricsPath returns the configured metrics endpoint path. -func (m *MetricsCollector) MetricsPath() string { return m.config.MetricsPath } - // Name returns the module name. func (m *MetricsCollector) Name() string { return m.name @@ -148,9 +142,9 @@ func (m *MetricsCollector) Init(app modular.Application) error { return app.RegisterService("metrics.collector", m) } -// Handler returns an HTTP handler that serves Prometheus metrics. -func (m *MetricsCollector) Handler() http.Handler { - return promhttp.HandlerFor(m.registry, promhttp.HandlerOpts{}) +// Gather returns the current Prometheus metric families without exposing an HTTP endpoint. +func (m *MetricsCollector) Gather() ([]*dto.MetricFamily, error) { + return m.registry.Gather() } // RecordWorkflowExecution increments the workflow execution counter. @@ -191,16 +185,6 @@ func (m *MetricsCollector) SetActiveWorkflows(workflowType string, count float64 } } -// MetricsHTTPHandler adapts an http.Handler to the HTTPHandler interface -type MetricsHTTPHandler struct { - Handler http.Handler -} - -// Handle implements the HTTPHandler interface -func (h *MetricsHTTPHandler) Handle(w http.ResponseWriter, r *http.Request) { - h.Handler.ServeHTTP(w, r) -} - // ProvidesServices returns the services provided by this module. func (m *MetricsCollector) ProvidesServices() []modular.ServiceProvider { return []modular.ServiceProvider{ diff --git a/module/metrics_test.go b/module/metrics_test.go index 1c9f8dca..18cf6daa 100644 --- a/module/metrics_test.go +++ b/module/metrics_test.go @@ -1,12 +1,10 @@ package module import ( - "io" - "net/http" - "net/http/httptest" - "strings" "testing" "time" + + dto "github.com/prometheus/client_model/go" ) func TestNewMetricsCollector(t *testing.T) { @@ -56,31 +54,32 @@ func TestMetricsCollector_SetActiveWorkflows(t *testing.T) { m.SetActiveWorkflows("http", 3) } -func TestMetricsCollector_Handler(t *testing.T) { +func TestMetricsCollector_Gather(t *testing.T) { m := NewMetricsCollector("test-metrics") // Record some metrics first m.RecordWorkflowExecution("http", "process", "success") m.RecordHTTPRequest("GET", "/test", 200, 10*time.Millisecond) - handler := m.Handler() - req := httptest.NewRequest("GET", "/metrics", nil) - rec := httptest.NewRecorder() - handler.ServeHTTP(rec, req) - - if rec.Code != http.StatusOK { - t.Errorf("expected 200, got %d", rec.Code) + families, err := m.Gather() + if err != nil { + t.Fatalf("Gather failed: %v", err) } - - body, _ := io.ReadAll(rec.Body) - bodyStr := string(body) - - if !strings.Contains(bodyStr, "workflow_executions_total") { - t.Error("expected metrics output to contain workflow_executions_total") + if !hasMetricFamily(families, "workflow_workflow_executions_total") { + t.Error("expected gathered metrics to contain workflow_workflow_executions_total") } - if !strings.Contains(bodyStr, "http_requests_total") { - t.Error("expected metrics output to contain http_requests_total") + if !hasMetricFamily(families, "workflow_http_requests_total") { + t.Error("expected gathered metrics to contain workflow_http_requests_total") + } +} + +func hasMetricFamily(families []*dto.MetricFamily, name string) bool { + for _, mf := range families { + if mf.GetName() == name { + return true + } } + return false } func TestMetricsCollector_ProvidesServices(t *testing.T) { diff --git a/module/reflect_validation_test.go b/module/reflect_validation_test.go index 6004021c..758458f0 100644 --- a/module/reflect_validation_test.go +++ b/module/reflect_validation_test.go @@ -149,8 +149,8 @@ func TestReflectValidation_HealthCheckerConfig(t *testing.T) { func TestReflectValidation_MetricsCollectorConfig(t *testing.T) { fields := schema.GenerateConfigFields(module.MetricsCollectorConfig{}) - if len(fields) != 4 { - t.Fatalf("expected 4 tagged fields, got %d", len(fields)) + if len(fields) != 3 { + t.Fatalf("expected 3 tagged fields, got %d", len(fields)) } namespace := fields[0] @@ -159,15 +159,7 @@ func TestReflectValidation_MetricsCollectorConfig(t *testing.T) { t.Errorf("namespace: expected default=workflow, got %v", namespace.DefaultValue) } - metricsPath := fields[2] - if metricsPath.Key != "metricsPath" { - t.Errorf("expected key=metricsPath, got %q", metricsPath.Key) - } - if metricsPath.DefaultValue != "/metrics" { - t.Errorf("metricsPath: expected default=/metrics, got %v", metricsPath.DefaultValue) - } - - enabledMetrics := fields[3] + enabledMetrics := fields[2] assertField(t, "enabledMetrics", enabledMetrics, schema.FieldTypeArray, false, false) if enabledMetrics.ArrayItemType != "string" { t.Errorf("enabledMetrics: expected arrayItemType=string, got %q", enabledMetrics.ArrayItemType) diff --git a/plugins/observability/modules.go b/plugins/observability/modules.go index 7884b6d5..e97e31c6 100644 --- a/plugins/observability/modules.go +++ b/plugins/observability/modules.go @@ -29,9 +29,6 @@ func metricsCollectorFactory(name string, cfg map[string]any) modular.Module { if v, ok := cfg["subsystem"].(string); ok { mcCfg.Subsystem = v } - if v, ok := cfg["metricsPath"].(string); ok { - mcCfg.MetricsPath = v - } if v, ok := cfg["enabledMetrics"].([]any); ok { enabled := make([]string, 0, len(v)) for _, item := range v { diff --git a/plugins/observability/plugin.go b/plugins/observability/plugin.go index 15d3fba8..98978a86 100644 --- a/plugins/observability/plugin.go +++ b/plugins/observability/plugin.go @@ -52,7 +52,6 @@ func New() *ObservabilityPlugin { WiringHooks: []string{ "observability.otel-middleware", "observability.health-endpoints", - "observability.metrics-endpoint", "observability.log-endpoint", "observability.openapi-endpoints", }, diff --git a/plugins/observability/plugin_test.go b/plugins/observability/plugin_test.go index ef830f45..3ef56525 100644 --- a/plugins/observability/plugin_test.go +++ b/plugins/observability/plugin_test.go @@ -116,7 +116,6 @@ func TestModuleFactoriesWithConfig(t *testing.T) { mod := factories["metrics.collector"]("mc", map[string]any{ "namespace": "testns", "subsystem": "testsub", - "metricsPath": "/test-metrics", "enabledMetrics": []any{"workflow"}, }) if mod == nil { @@ -209,6 +208,16 @@ func TestModuleSchemasValidFields(t *testing.T) { p := New() for _, s := range p.ModuleSchemas() { t.Run(s.Type, func(t *testing.T) { + if s.Type == "metrics.collector" { + for _, f := range s.ConfigFields { + if f.Key == "metricsPath" { + t.Fatal("metrics.collector schema must not expose a custom metrics endpoint path") + } + } + if _, ok := s.DefaultConfig["metricsPath"]; ok { + t.Fatal("metrics.collector default config must not include a custom metrics endpoint path") + } + } for _, f := range s.ConfigFields { if f.Key == "" { t.Errorf("field has empty Key") @@ -243,15 +252,14 @@ func TestWiringHooks(t *testing.T) { p := New() hooks := p.WiringHooks() - if len(hooks) != 6 { - t.Fatalf("WiringHooks() count = %d, want 6", len(hooks)) + if len(hooks) != 5 { + t.Fatalf("WiringHooks() count = %d, want 5", len(hooks)) } expectedNames := map[string]bool{ "observability.otel-middleware": false, "observability.telemetry-bridge": false, "observability.health-endpoints": false, - "observability.metrics-endpoint": false, "observability.log-endpoint": false, "observability.openapi-endpoints": false, } diff --git a/plugins/observability/schemas.go b/plugins/observability/schemas.go index f38137f8..11e4e6d6 100644 --- a/plugins/observability/schemas.go +++ b/plugins/observability/schemas.go @@ -9,15 +9,14 @@ func moduleSchemas() []*schema.ModuleSchema { Type: "metrics.collector", Label: "Metrics Collector", Category: "observability", - Description: "Collects and exposes application metrics", - Outputs: []schema.ServiceIODef{{Name: "metrics", Type: "prometheus.Metrics", Description: "Prometheus metrics endpoint"}}, + Description: "Collects application metrics for telemetry export", + Outputs: []schema.ServiceIODef{{Name: "metrics", Type: "prometheus.Metrics", Description: "Prometheus metrics registry"}}, ConfigFields: []schema.ConfigFieldDef{ {Key: "namespace", Label: "Namespace", Type: schema.FieldTypeString, DefaultValue: "workflow", Description: "Prometheus metric namespace prefix", Placeholder: "workflow"}, {Key: "subsystem", Label: "Subsystem", Type: schema.FieldTypeString, Description: "Prometheus metric subsystem", Placeholder: "api"}, - {Key: "metricsPath", Label: "Metrics Path", Type: schema.FieldTypeString, DefaultValue: "/metrics", Description: "Endpoint path for Prometheus scraping", Placeholder: "/metrics"}, {Key: "enabledMetrics", Label: "Enabled Metrics", Type: schema.FieldTypeArray, ArrayItemType: "string", DefaultValue: []string{"workflow", "http", "module", "active_workflows"}, Description: "Which metric groups to register (workflow, http, module, active_workflows)"}, }, - DefaultConfig: map[string]any{"namespace": "workflow", "metricsPath": "/metrics", "enabledMetrics": []string{"workflow", "http", "module", "active_workflows"}}, + DefaultConfig: map[string]any{"namespace": "workflow", "enabledMetrics": []string{"workflow", "http", "module", "active_workflows"}}, }, { Type: "health.checker", diff --git a/plugins/observability/wiring.go b/plugins/observability/wiring.go index f4125efc..2ca19b76 100644 --- a/plugins/observability/wiring.go +++ b/plugins/observability/wiring.go @@ -17,7 +17,7 @@ func wiringHooks() []plugin.WiringHook { return []plugin.WiringHook{ { // Run at priority 100 (highest) so OTEL wraps all other middleware - // and every request — including health, metrics, and pipeline routes + // and every request — including health and pipeline routes // registered later — is captured in a trace span. Name: "observability.otel-middleware", Priority: 100, @@ -28,11 +28,6 @@ func wiringHooks() []plugin.WiringHook { Priority: 50, Hook: wireHealthEndpoints, }, - { - Name: "observability.metrics-endpoint", - Priority: 50, - Hook: wireMetricsEndpoint, - }, { Name: "observability.log-endpoint", Priority: 50, @@ -40,7 +35,7 @@ func wiringHooks() []plugin.WiringHook { }, { Name: "observability.openapi-endpoints", - Priority: 40, // run after health/metrics so routes are stable + Priority: 40, // run after health/log endpoints so routes are stable Hook: wireOpenAPIEndpoints, }, { @@ -146,28 +141,6 @@ func wireHealthEndpoints(app modular.Application, _ *config.WorkflowConfig) erro return nil } -// wireMetricsEndpoint registers the metrics endpoint on any available router. -func wireMetricsEndpoint(app modular.Application, _ *config.WorkflowConfig) error { - for _, svc := range app.SvcRegistry() { - mc, ok := svc.(*module.MetricsCollector) - if !ok { - continue - } - metricsPath := mc.MetricsPath() - for _, routerSvc := range app.SvcRegistry() { - router, ok := routerSvc.(*module.StandardHTTPRouter) - if !ok { - continue - } - if !router.HasRoute("GET", metricsPath) { - router.AddRoute("GET", metricsPath, &module.MetricsHTTPHandler{Handler: mc.Handler()}) - } - break - } - } - return nil -} - // wireLogEndpoint registers the log collector endpoint on any available router. func wireLogEndpoint(app modular.Application, _ *config.WorkflowConfig) error { for _, svc := range app.SvcRegistry() { diff --git a/schema/module_schema.go b/schema/module_schema.go index 52ac0708..655c267f 100644 --- a/schema/module_schema.go +++ b/schema/module_schema.go @@ -569,15 +569,14 @@ func (r *ModuleSchemaRegistry) registerBuiltins() { Type: "metrics.collector", Label: "Metrics Collector", Category: "observability", - Description: "Collects and exposes application metrics", - Outputs: []ServiceIODef{{Name: "metrics", Type: "prometheus.Metrics", Description: "Prometheus metrics endpoint"}}, + Description: "Collects application metrics for telemetry export", + Outputs: []ServiceIODef{{Name: "metrics", Type: "prometheus.Metrics", Description: "Prometheus metrics registry"}}, ConfigFields: []ConfigFieldDef{ {Key: "namespace", Label: "Namespace", Type: FieldTypeString, DefaultValue: "workflow", Description: "Prometheus metric namespace prefix", Placeholder: "workflow"}, {Key: "subsystem", Label: "Subsystem", Type: FieldTypeString, Description: "Prometheus metric subsystem", Placeholder: "api"}, - {Key: "metricsPath", Label: "Metrics Path", Type: FieldTypeString, DefaultValue: "/metrics", Description: "Endpoint path for Prometheus scraping", Placeholder: "/metrics"}, {Key: "enabledMetrics", Label: "Enabled Metrics", Type: FieldTypeArray, ArrayItemType: "string", DefaultValue: []string{"workflow", "http", "module", "active_workflows"}, Description: "Which metric groups to register (workflow, http, module, active_workflows)"}, }, - DefaultConfig: map[string]any{"namespace": "workflow", "metricsPath": "/metrics", "enabledMetrics": []string{"workflow", "http", "module", "active_workflows"}}, + DefaultConfig: map[string]any{"namespace": "workflow", "enabledMetrics": []string{"workflow", "http", "module", "active_workflows"}}, }) r.Register(&ModuleSchema{ diff --git a/schema/testdata/editor-schemas.golden.json b/schema/testdata/editor-schemas.golden.json index 62280233..e5b8f74c 100644 --- a/schema/testdata/editor-schemas.golden.json +++ b/schema/testdata/editor-schemas.golden.json @@ -2175,12 +2175,12 @@ "type": "metrics.collector", "label": "Metrics Collector", "category": "observability", - "description": "Collects and exposes application metrics", + "description": "Collects application metrics for telemetry export", "outputs": [ { "name": "metrics", "type": "prometheus.Metrics", - "description": "Prometheus metrics endpoint" + "description": "Prometheus metrics registry" } ], "configFields": [ @@ -2199,14 +2199,6 @@ "description": "Prometheus metric subsystem", "placeholder": "api" }, - { - "key": "metricsPath", - "label": "Metrics Path", - "type": "string", - "description": "Endpoint path for Prometheus scraping", - "defaultValue": "/metrics", - "placeholder": "/metrics" - }, { "key": "enabledMetrics", "label": "Enabled Metrics", @@ -2228,7 +2220,6 @@ "module", "active_workflows" ], - "metricsPath": "/metrics", "namespace": "workflow" } },