blob: 56559b1509802d776b7d4249c29b168a9758d9a8 [file] [log] [blame]
// Licensed to Apache Software Foundation (ASF) under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
// ownership. Apache Software Foundation (ASF) 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 core
import (
"fmt"
defLog "log"
"os"
"reflect"
"github.com/apache/skywalking-go/plugins/core/operator"
"github.com/apache/skywalking-go/plugins/core/reporter"
)
// nolint
const defaultLogPrefix = "skywalking-go "
type CorrelationConfig struct {
MaxKeyCount int
MaxValueSize int
}
type Tracer struct {
ServiceEntity *reporter.Entity
Reporter reporter.Reporter
// 0 not init 1 init
initFlag int32
Sampler Sampler
Log *LogWrapper
// correlation *CorrelationConfig // temporarily disable, because haven't been implemented yet
cdsWatchers []reporter.AgentConfigChangeWatcher
}
func (t *Tracer) Init(entity *reporter.Entity, rep reporter.Reporter, samp Sampler, logger operator.LogOperator) error {
t.ServiceEntity = entity
t.Reporter = rep
t.Sampler = samp
if logger != nil && !reflect.ValueOf(logger).IsZero() {
t.Log.ChangeLogger(logger)
}
t.Reporter.Boot(entity, t.cdsWatchers)
t.initFlag = 1
return nil
}
func (t *Tracer) Entity() interface{} {
return t.ServiceEntity
}
func NewEntity(service, instanceEnvName string) *reporter.Entity {
instanceName := os.Getenv(instanceEnvName)
if instanceName == "" {
id, err := UUID()
if err != nil {
panic(fmt.Sprintf("generate UUID failure: %v", err))
}
instanceName = id + "@" + IPV4()
}
propResult := buildOSInfo()
return &reporter.Entity{
ServiceName: service,
ServiceInstanceName: instanceName,
Props: propResult,
}
}
// create tracer when init the agent core
// nolint
func newTracer() *Tracer {
return &Tracer{
initFlag: 0,
Reporter: &emptyReporter{},
Sampler: NewConstSampler(false),
Log: &LogWrapper{newDefaultLogger()},
cdsWatchers: make([]reporter.AgentConfigChangeWatcher, 0),
}
}
func (t *Tracer) InitSuccess() bool {
return t.initFlag == 1
}
func (t *Tracer) ChangeLogger(logger interface{}) {
t.Log.ChangeLogger(logger.(operator.LogOperator))
}
// nolint
type emptyReporter struct{}
// nolint
func (e *emptyReporter) Boot(entity *reporter.Entity, cdsWatchers []reporter.AgentConfigChangeWatcher) {
}
// nolint
func (e *emptyReporter) Send(spans []reporter.ReportedSpan) {
}
// nolint
func (e *emptyReporter) Close() {
}
type LogWrapper struct {
Logger operator.LogOperator
}
func (l *LogWrapper) ChangeLogger(logger operator.LogOperator) {
l.Logger = logger
}
func (l *LogWrapper) WithField(key string, value interface{}) interface{} {
return l.Logger.WithField(key, value)
}
func (l *LogWrapper) Info(args ...interface{}) {
l.Logger.Info(args...)
}
func (l *LogWrapper) Infof(format string, args ...interface{}) {
l.Logger.Infof(format, args...)
}
func (l *LogWrapper) Warn(args ...interface{}) {
l.Logger.Warn(args...)
}
func (l *LogWrapper) Warnf(format string, args ...interface{}) {
l.Logger.Warnf(format, args...)
}
func (l *LogWrapper) Error(args ...interface{}) {
l.Logger.Error(args...)
}
func (l *LogWrapper) Errorf(format string, args ...interface{}) {
l.Logger.Errorf(format, args...)
}
// nolint
type defaultLogger struct {
log *defLog.Logger
}
// nolint
func newDefaultLogger() *defaultLogger {
return &defaultLogger{
log: defLog.New(os.Stderr, defaultLogPrefix, defLog.LstdFlags),
}
}
func (d *defaultLogger) WithField(key string, value interface{}) interface{} {
return d
}
// nolint
func (d *defaultLogger) Info(args ...interface{}) {
d.log.Print(args...)
}
// nolint
func (d *defaultLogger) Infof(format string, args ...interface{}) {
d.log.Printf(format, args...)
}
// nolint
func (d *defaultLogger) Warn(args ...interface{}) {
d.log.Print(args...)
}
// nolint
func (d *defaultLogger) Warnf(format string, args ...interface{}) {
d.log.Printf(format, args...)
}
// nolint
func (d *defaultLogger) Error(args ...interface{}) {
d.log.Print(args...)
}
// nolint
func (d *defaultLogger) Errorf(format string, args ...interface{}) {
d.log.Printf(format, args...)
}