tools/go-agent/instrument/plugins/enhance_instance.go (92 lines of code) (raw):

// 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 plugins import ( "fmt" "path/filepath" "github.com/apache/skywalking-go/plugins/core/instrument" "github.com/apache/skywalking-go/tools/go-agent/tools" "github.com/dave/dst" ) var EnhanceInstanceField = "skywalkingDynamicField" type InstanceEnhance struct { packageName string typeSpec *dst.TypeSpec } func NewInstanceEnhance(typeSpec *dst.TypeSpec, basePackage string, p *instrument.Point) *InstanceEnhance { pkgName := filepath.Base(filepath.Join(basePackage, p.PackagePath)) if p.PackageName != "" { pkgName = p.PackageName } return &InstanceEnhance{ packageName: pkgName, typeSpec: typeSpec, } } func (i *InstanceEnhance) PackageName() string { return i.packageName } func (i *InstanceEnhance) EnhanceField() { structType := i.typeSpec.Type.(*dst.StructType) structType.Fields.List = append(structType.Fields.List, &dst.Field{ Names: []*dst.Ident{dst.NewIdent(EnhanceInstanceField)}, Type: dst.NewIdent("interface{}"), }) } func (i *InstanceEnhance) BuildImports(decl *dst.GenDecl) { } func (i *InstanceEnhance) BuildForDelegator() []dst.Decl { return []dst.Decl{ &dst.FuncDecl{ Name: &dst.Ident{Name: "GetSkyWalkingDynamicField"}, Recv: &dst.FieldList{ List: []*dst.Field{ { Names: []*dst.Ident{dst.NewIdent("receiver")}, Type: &dst.StarExpr{X: &dst.SelectorExpr{X: dst.NewIdent(i.packageName), Sel: dst.NewIdent(i.typeSpec.Name.Name)}}, }, }, }, Type: &dst.FuncType{ Params: &dst.FieldList{}, Results: &dst.FieldList{ List: []*dst.Field{ {Type: dst.NewIdent("interface{}")}, }, }, }, Body: &dst.BlockStmt{ List: tools.GoStringToStats(fmt.Sprintf("return receiver.%s", EnhanceInstanceField)), }, }, &dst.FuncDecl{ Name: &dst.Ident{Name: "SetSkyWalkingDynamicField"}, Recv: &dst.FieldList{ List: []*dst.Field{ { Names: []*dst.Ident{dst.NewIdent("receiver")}, Type: &dst.StarExpr{X: &dst.SelectorExpr{X: dst.NewIdent(i.packageName), Sel: dst.NewIdent(i.typeSpec.Name.Name)}}, }, }, }, Type: &dst.FuncType{ Params: &dst.FieldList{ List: []*dst.Field{ { Names: []*dst.Ident{dst.NewIdent("param")}, Type: dst.NewIdent("interface{}"), }, }, }, Results: &dst.FieldList{}, }, Body: &dst.BlockStmt{ List: tools.GoStringToStats(fmt.Sprintf("receiver.%s = param", EnhanceInstanceField)), }, }, } } func (i *InstanceEnhance) ReplaceFileContent(path, content string) string { return content } func (i *InstanceEnhance) InitFunctions() []*EnhanceInitFunction { return nil }