mirror of
https://github.com/status-im/consul.git
synced 2025-01-10 05:45:46 +00:00
828567c62e
* OTElExporter now uses an EndpointProvider to discover the endpoint * OTELSink uses a ConfigProvider to obtain filters and labels configuration * improve tests for otel_sink * Regex logic is moved into client for a method on the TelemetryConfig object * Create a telemetry_config_provider and update deps to use it * Fix conversion * fix import newline * Add logger to hcp client and move telemetry_config out of the client.go file * Add a telemetry_config.go to refactor client.go * Update deps * update hcp deps test * Modify telemetry_config_providers * Check for nil filters * PR review updates * Fix comments and move around pieces * Fix comments * Remove context from client struct * Moved ctx out of sink struct and fixed filters, added a test * Remove named imports, use errors.New if not fformatting * Remove HCP dependencies in telemetry package * Add success metric and move lock only to grab the t.cfgHahs * Update hash * fix nits * Create an equals method and add tests * Improve telemetry_config_provider.go tests * Add race test * Add missing godoc * Remove mock for MetricsClient * Avoid goroutine test panics * trying to kick CI lint issues by upgrading mod * imprve test code and add hasher for testing * Use structure logging for filters, fix error constants, and default to allow all regex * removed hashin and modify logic to simplify * Improve race test and fix PR feedback by removing hash equals and avoid testing the timer.Ticker logic, and instead unit test * Ran make go-mod-tidy * Use errtypes in the test * Add changelog * add safety check for exporter endpoint * remove require.Contains by using error types, fix structure logging, and fix success metric typo in exporter * Fixed race test to have changing config values * Send success metric before modifying config * Avoid the defer and move the success metric under
100 lines
2.7 KiB
Go
100 lines
2.7 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
package hcp
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/armon/go-metrics"
|
|
hcpclient "github.com/hashicorp/consul/agent/hcp/client"
|
|
"github.com/hashicorp/consul/agent/hcp/config"
|
|
"github.com/hashicorp/consul/agent/hcp/scada"
|
|
"github.com/hashicorp/consul/agent/hcp/telemetry"
|
|
"github.com/hashicorp/go-hclog"
|
|
)
|
|
|
|
// Deps contains the interfaces that the rest of Consul core depends on for HCP integration.
|
|
type Deps struct {
|
|
Client hcpclient.Client
|
|
Provider scada.Provider
|
|
Sink metrics.MetricSink
|
|
}
|
|
|
|
func NewDeps(cfg config.CloudConfig, logger hclog.Logger) (Deps, error) {
|
|
ctx := context.Background()
|
|
ctx = hclog.WithContext(ctx, logger)
|
|
|
|
client, err := hcpclient.NewClient(cfg)
|
|
if err != nil {
|
|
return Deps{}, fmt.Errorf("failed to init client: %w", err)
|
|
}
|
|
|
|
provider, err := scada.New(cfg, logger.Named("scada"))
|
|
if err != nil {
|
|
return Deps{}, fmt.Errorf("failed to init scada: %w", err)
|
|
}
|
|
|
|
metricsClient, err := hcpclient.NewMetricsClient(ctx, &cfg)
|
|
if err != nil {
|
|
logger.Error("failed to init metrics client", "error", err)
|
|
return Deps{}, fmt.Errorf("failed to init metrics client: %w", err)
|
|
}
|
|
|
|
sink, err := sink(ctx, client, metricsClient)
|
|
if err != nil {
|
|
// Do not prevent server start if sink init fails, only log error.
|
|
logger.Error("failed to init sink", "error", err)
|
|
}
|
|
|
|
return Deps{
|
|
Client: client,
|
|
Provider: provider,
|
|
Sink: sink,
|
|
}, nil
|
|
}
|
|
|
|
// sink initializes an OTELSink which forwards Consul metrics to HCP.
|
|
// The sink is only initialized if the server is registered with the management plane (CCM).
|
|
// This step should not block server initialization, errors are returned, only to be logged.
|
|
func sink(
|
|
ctx context.Context,
|
|
hcpClient hcpclient.Client,
|
|
metricsClient telemetry.MetricsClient,
|
|
) (metrics.MetricSink, error) {
|
|
logger := hclog.FromContext(ctx).Named("sink")
|
|
reqCtx, cancel := context.WithTimeout(ctx, 5*time.Second)
|
|
defer cancel()
|
|
|
|
telemetryCfg, err := hcpClient.FetchTelemetryConfig(reqCtx)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to fetch telemetry config: %w", err)
|
|
}
|
|
|
|
if !telemetryCfg.MetricsEnabled() {
|
|
return nil, nil
|
|
}
|
|
|
|
cfgProvider, err := NewHCPProvider(ctx, hcpClient, telemetryCfg)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to init config provider: %w", err)
|
|
}
|
|
|
|
reader := telemetry.NewOTELReader(metricsClient, cfgProvider, telemetry.DefaultExportInterval)
|
|
sinkOpts := &telemetry.OTELSinkOpts{
|
|
Reader: reader,
|
|
ConfigProvider: cfgProvider,
|
|
}
|
|
|
|
sink, err := telemetry.NewOTELSink(ctx, sinkOpts)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed create OTELSink: %w", err)
|
|
}
|
|
|
|
logger.Debug("initialized HCP metrics sink")
|
|
|
|
return sink, nil
|
|
}
|