mirror of https://github.com/knative/pkg.git
128 lines
5.1 KiB
Go
128 lines
5.1 KiB
Go
/*
|
|
Copyright 2020 The Knative Authors
|
|
|
|
Licensed 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 tracing
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"go.uber.org/zap"
|
|
|
|
corev1 "k8s.io/api/core/v1"
|
|
"knative.dev/pkg/configmap"
|
|
"knative.dev/pkg/tracing/config"
|
|
)
|
|
|
|
type Tracer interface {
|
|
// Shutdown allows for proper cleanup/flush.
|
|
Shutdown(ctx context.Context) error
|
|
}
|
|
|
|
// SetupPublishingWithStaticConfig sets up trace publishing for the process. The caller should call .Shutdown() on
|
|
// the returned Tracer before shutdown to make sure all traces are properly flushed.
|
|
// Note that other pieces still need to generate the traces, this just ensures that if generated, they are collected
|
|
// appropriately. This is normally done by using tracing.HTTPSpanMiddleware as a middleware HTTP
|
|
// handler. The configuration will not be dynamically updated.
|
|
func SetupPublishingWithStaticConfig(logger *zap.SugaredLogger, serviceName string, cfg *config.Config) (Tracer, error) {
|
|
oct := NewOpenCensusTracer(WithExporter(serviceName, logger))
|
|
if err := oct.ApplyConfig(cfg); err != nil {
|
|
return oct, fmt.Errorf("unable to set OpenCensusTracing config: %w", err)
|
|
}
|
|
return oct, nil
|
|
}
|
|
|
|
// Deprecated: Use SetupPublishingWithStaticConfig.
|
|
func SetupStaticPublishing(logger *zap.SugaredLogger, serviceName string, cfg *config.Config) error {
|
|
_, err := SetupPublishingWithStaticConfig(logger, serviceName, cfg)
|
|
return err
|
|
}
|
|
|
|
// SetupPublishingWithDynamicConfig sets up trace publishing for the process, by watching a
|
|
// ConfigMap for the configuration. The caller should call .Shutdown() on
|
|
// the returned OpenCensusTracer before shutdown to make sure all traces are properly flushed.
|
|
// Note that other pieces still need to generate the traces, this
|
|
// just ensures that if generated, they are collected appropriately. This is normally done by using
|
|
// tracing.HTTPSpanMiddleware as a middleware HTTP handler. The configuration will be dynamically
|
|
// updated when the ConfigMap is updated.
|
|
func SetupPublishingWithDynamicConfig(logger *zap.SugaredLogger, configMapWatcher configmap.Watcher, serviceName, tracingConfigName string) (Tracer, error) {
|
|
oct := NewOpenCensusTracer(WithExporter(serviceName, logger))
|
|
|
|
tracerUpdater := func(name string, value interface{}) {
|
|
if name == tracingConfigName {
|
|
cfg := value.(*config.Config)
|
|
logger.Debugw("Updating tracing config", zap.Any("cfg", cfg))
|
|
if err := oct.ApplyConfig(cfg); err != nil {
|
|
logger.Errorw("Unable to apply open census tracer config", zap.Error(err))
|
|
}
|
|
}
|
|
}
|
|
|
|
// Set up our config store.
|
|
configStore := configmap.NewUntypedStore(
|
|
"config-tracing-store",
|
|
logger,
|
|
configmap.Constructors{
|
|
"config-tracing": config.NewTracingConfigFromConfigMap,
|
|
},
|
|
tracerUpdater)
|
|
configStore.WatchConfigs(configMapWatcher)
|
|
return oct, nil
|
|
}
|
|
|
|
// Deprecated: Use SetupPublishingWithDynamicConfig.
|
|
func SetupDynamicPublishing(logger *zap.SugaredLogger, configMapWatcher configmap.Watcher, serviceName, tracingConfigName string) error {
|
|
_, err := SetupPublishingWithDynamicConfig(logger, configMapWatcher, serviceName, tracingConfigName)
|
|
return err
|
|
}
|
|
|
|
// SetupPublishingWithDynamicConfigAndInitialValue sets up the trace publishing for the process with an
|
|
// initial value, by watching a ConfigMap for the configuration. Note that other pieces still
|
|
// need to generate the traces, this just ensures that if generated, they are collected
|
|
// appropriately. This is normally done by using tracing.HTTPSpanMiddleware as a middleware
|
|
// HTTP handler. The configuration will be dynamically updated when the ConfigMap is updated.
|
|
func SetupPublishingWithDynamicConfigAndInitialValue(logger *zap.SugaredLogger, configMapWatcher configmap.Watcher, serviceName string, configm *corev1.ConfigMap) (Tracer, error) {
|
|
oct := NewOpenCensusTracer(WithExporter(serviceName, logger))
|
|
cfg, err := config.NewTracingConfigFromConfigMap(configm)
|
|
if err != nil {
|
|
return oct, fmt.Errorf("error while parsing %s config map: %w", configm.Name, err)
|
|
}
|
|
if err = oct.ApplyConfig(cfg); err != nil {
|
|
return oct, fmt.Errorf("unable to set OpenCensusTracing config: %w", err)
|
|
}
|
|
|
|
tracerUpdater := func(name string, value interface{}) {
|
|
if name == configm.Name {
|
|
cfg := value.(*config.Config)
|
|
logger.Debugw("Updating tracing config", zap.Any("cfg", cfg))
|
|
if err := oct.ApplyConfig(cfg); err != nil {
|
|
logger.Errorw("Unable to apply open census tracer config", zap.Error(err))
|
|
}
|
|
}
|
|
}
|
|
|
|
// Set up our config store.
|
|
configStore := configmap.NewUntypedStore(
|
|
"config-tracing-store",
|
|
logger,
|
|
configmap.Constructors{
|
|
"config-tracing": config.NewTracingConfigFromConfigMap,
|
|
},
|
|
tracerUpdater)
|
|
configStore.WatchConfigs(configMapWatcher)
|
|
return oct, nil
|
|
}
|