mirror of
https://github.com/status-im/consul.git
synced 2025-02-22 10:28:31 +00:00
* Update SCADA provider version Also update mocks for SCADA provider. * Create SCADA provider w/o HCP config, then update Adds a placeholder config option to allow us to initialize a SCADA provider without the HCP configuration. Also adds an update method to then add the HCP configuration. We need this to be able to eventually always register a SCADA listener at startup before the HCP config values are known. * Pass cloud configuration to HCP manager Save the entire cloud configuration and pass it to the HCP manager. * Update and start SCADA provider in HCP manager Move config updating and starting to the HCP manager. The HCP manager will eventually be responsible for all processes that contribute to linking to HCP.
83 lines
2.1 KiB
Go
83 lines
2.1 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
package hcp
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/armon/go-metrics"
|
|
"github.com/hashicorp/go-hclog"
|
|
|
|
"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"
|
|
)
|
|
|
|
// Deps contains the interfaces that the rest of Consul core depends on for HCP integration.
|
|
type Deps struct {
|
|
Client client.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)
|
|
|
|
hcpClient, err := client.NewClient(cfg)
|
|
if err != nil {
|
|
return Deps{}, fmt.Errorf("failed to init client: %w", err)
|
|
}
|
|
|
|
provider, err := scada.New(logger.Named("scada"))
|
|
if err != nil {
|
|
return Deps{}, fmt.Errorf("failed to init scada: %w", err)
|
|
}
|
|
|
|
metricsClient, err := client.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, metricsClient, NewHCPProvider(ctx, hcpClient))
|
|
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: hcpClient,
|
|
Provider: provider,
|
|
Sink: sink,
|
|
}, nil
|
|
}
|
|
|
|
// sink initializes an OTELSink which forwards Consul metrics to HCP.
|
|
// This step should not block server initialization, errors are returned, only to be logged.
|
|
func sink(
|
|
ctx context.Context,
|
|
metricsClient telemetry.MetricsClient,
|
|
cfgProvider *hcpProviderImpl,
|
|
) (metrics.MetricSink, error) {
|
|
logger := hclog.FromContext(ctx)
|
|
|
|
reader := telemetry.NewOTELReader(metricsClient, cfgProvider)
|
|
sinkOpts := &telemetry.OTELSinkOpts{
|
|
Reader: reader,
|
|
ConfigProvider: cfgProvider,
|
|
}
|
|
|
|
sink, err := telemetry.NewOTELSink(ctx, sinkOpts)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to create OTELSink: %w", err)
|
|
}
|
|
|
|
logger.Debug("initialized HCP metrics sink")
|
|
|
|
return sink, nil
|
|
}
|