pkg/metricgen/config.go (78 lines of code) (raw):
// Licensed to Elasticsearch B.V. under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
// ownership. Elasticsearch B.V. licenses this file to you under
// the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package metricgen
import (
"errors"
"fmt"
)
type ConfigOption func(*config)
type config struct {
// apiKey holds an Elasticsearch API key.
apiKey string
// apmServerURL holdes the Elasticsearch APM server URL endpoint.
apmServerURL string
// verifyServerCert determines if endpoint TLS certificates will be validated.
verifyServerCert bool
// apmServiceName holds the service name sent with Elastic APM metrics.
apmServiceName string
// otlpServiceName holds the service name sent with OTLP metrics.
otlpServiceName string
// otlpProtocol specifies the OTLP protocol to use for sending metrics.
// Valid values are: grpc, http/protobuf.
otlpProtocol string
}
const (
grpcOTLPProtocol = "grpc"
httpOTLPProtocol = "http/protobuf"
)
func (cfg config) Validate() error {
var errs []error
if cfg.apmServiceName == "" && cfg.otlpServiceName == "" {
errs = append(errs, errors.New("both APM service name and OTLP service name cannot be empty"))
}
if cfg.apmServerURL == "" {
errs = append(errs, errors.New("APM server URL cannot be empty"))
}
if cfg.apiKey == "" {
errs = append(errs, errors.New("API Key cannot be empty"))
}
switch cfg.otlpProtocol {
case httpOTLPProtocol, grpcOTLPProtocol:
default:
errs = append(errs, fmt.Errorf("unknown otlp protocol: %s", cfg.otlpProtocol))
}
if len(errs) > 0 {
return errors.Join(errs...)
}
return nil
}
func newConfig(opts ...ConfigOption) config {
cfg := config{
otlpProtocol: "grpc",
}
for _, opt := range opts {
opt(&cfg)
}
return cfg
}
func WithAPIKey(s string) ConfigOption {
return func(c *config) {
c.apiKey = s
}
}
func WithAPMServerURL(s string) ConfigOption {
return func(c *config) {
c.apmServerURL = s
}
}
func WithVerifyServerCert(b bool) ConfigOption {
return func(c *config) {
c.verifyServerCert = b
}
}
// WithElasticAPMServiceName specifies the service name that
// the Elastic APM agent will use.
//
// This config will be ignored when using SendOTLPTrace.
func WithElasticAPMServiceName(s string) ConfigOption {
return func(c *config) {
c.apmServiceName = s
}
}
// WithOTLPServiceName specifies the service name that the
// OpenTelemetry SDK will use.
//
// This config will be ignored when using SendIntakeV2Trace.
func WithOTLPServiceName(s string) ConfigOption {
return func(c *config) {
c.otlpServiceName = s
}
}
// WithOTLPProtocol specifies OTLP transport protocol to one of:
// grpc (default), http/protobuf.
//
// This config will be ignored when using SendIntakeV2Trace
func WithOTLPProtocol(p string) ConfigOption {
return func(c *config) {
c.otlpProtocol = p
}
}