Skip to content

Commit 19f0d62

Browse files
committed
Add APM support with SGM appender and enhance deployment label handling
1 parent 7b15bea commit 19f0d62

File tree

5 files changed

+107
-4
lines changed

5 files changed

+107
-4
lines changed

main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"go.uber.org/zap"
1616

1717
"github.com/jd-opensource/joylive-injector/pkg/admission"
18+
_ "github.com/jd-opensource/joylive-injector/pkg/apm"
1819
_ "github.com/jd-opensource/joylive-injector/pkg/mutation"
1920
_ "github.com/jd-opensource/joylive-injector/pkg/watcher"
2021

pkg/apm/sgm.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package apm
2+
3+
import (
4+
"context"
5+
"github.com/jd-opensource/joylive-injector/pkg/config"
6+
"k8s.io/api/apps/v1"
7+
)
8+
9+
type SgmAppender struct {
10+
}
11+
12+
// SgmAppender implements the Appender interface
13+
var _ Appender = &SgmAppender{}
14+
15+
// init registers the SgmAppender with the Appender factory
16+
func init() {
17+
RegisterAppenderType("sgm", &SgmAppender{})
18+
}
19+
20+
// Modify modifies the Deployment object by adding specific labels to its template
21+
func (s *SgmAppender) Modify(ctx context.Context, target *v1.Deployment) (bool, error) {
22+
added := false
23+
if _, ok := target.Spec.Template.Labels["sgm.jd.com/app"]; !ok {
24+
target.Spec.Template.Labels["sgm.jd.com/app"] = target.Labels[config.ApplicationLabel]
25+
added = true
26+
}
27+
if _, ok := target.Spec.Template.Labels["sgm.jd.com/group"]; !ok {
28+
target.Spec.Template.Labels["sgm.jd.com/group"] = target.Labels[config.ServiceGroupLabel]
29+
added = true
30+
}
31+
if _, ok := target.Spec.Template.Labels["sgm.jd.com/probe-inject"]; !ok {
32+
target.Spec.Template.Labels["sgm.jd.com/probe-inject"] = "true"
33+
added = true
34+
}
35+
if _, ok := target.Spec.Template.Labels["sgm.jd.com/sink"]; !ok {
36+
target.Spec.Template.Labels["sgm.jd.com/sink"] = "Http"
37+
added = true
38+
}
39+
if _, ok := target.Spec.Template.Labels["sgm.jd.com/tenant"]; !ok {
40+
target.Spec.Template.Labels["sgm.jd.com/tenant"] = target.Labels["sgm.jd.com/tenant"]
41+
added = true
42+
}
43+
return added, nil
44+
}

pkg/apm/types.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package apm
2+
3+
import (
4+
"context"
5+
v1 "k8s.io/api/apps/v1"
6+
"sync"
7+
)
8+
9+
type Appender interface {
10+
Modify(ctx context.Context, target *v1.Deployment) (bool, error)
11+
}
12+
13+
// AppenderTypes is a factory holder for any AppenderType
14+
var AppenderTypes = make(map[string]Appender)
15+
16+
var mux sync.Mutex
17+
18+
// RegisterAppenderType Inject the Appender factory to automatically generate Appender objects.
19+
func RegisterAppenderType(key string, appender Appender) {
20+
mux.Lock()
21+
defer mux.Unlock()
22+
if _, ok := AppenderTypes[key]; !ok {
23+
AppenderTypes[key] = appender
24+
}
25+
}

pkg/config/config.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ const (
2929
ServiceSpaceLabel = "jmsf.jd.com/space"
3030
JdapServiceSpaceLabel = "jmsf.jd.com/service-space"
3131
ApplicationLabel = "jmsf.jd.com/app"
32+
EnhanceTypeLabel = "jmsf.jd.com/enhance"
33+
EnhanceTypeAgent = "agent"
34+
EnhanceTypeSidecar = "sidecar"
35+
SidecarEnhanceLabel = "sidecar.istio.io/inject"
36+
ApmTypeLabel = "jmsf.jd.com/apm"
3237
JdapApplicationLabel = "app.jdap.io/name"
3338
WebHookMatchKeyEnv = "JOYLIVE_MATCH_KEY"
3439
WebHookMatchValueEnv = "JOYLIVE_MATCH_VALUE"

pkg/mutation/mutation_deploy.go

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"encoding/json"
66
"fmt"
77
"github.com/jd-opensource/joylive-injector/pkg/admission"
8+
"github.com/jd-opensource/joylive-injector/pkg/apm"
89
"github.com/jd-opensource/joylive-injector/pkg/config"
910
"github.com/jd-opensource/joylive-injector/pkg/log"
1011
"github.com/jd-opensource/joylive-injector/pkg/resource"
@@ -85,11 +86,38 @@ func injectionDeploy(request *admissionv1.AdmissionRequest) (*admissionv1.Admiss
8586

8687
target := deploy.DeepCopy()
8788
added := false
88-
// Check if the x-live-enabled label exists in deploy's spec.template.metadata.labels; if not, add it.
89-
if _, ok := deploy.Spec.Template.Labels[config.WebHookMatchKey]; !ok {
90-
log.Infof("[mutation] /injection-deploy: add label %s to deployment %s/%s", config.WebHookMatchKey, deploy.Name, deploy.Namespace)
91-
target.Spec.Template.Labels[config.WebHookMatchKey] = config.WebHookMatchValue
89+
90+
if enhanceType, ok := deploy.Labels[config.EnhanceTypeLabel]; ok && enhanceType == config.EnhanceTypeSidecar {
91+
log.Infof("[mutation] /injection-deploy: add label %s to deployment %s/%s", config.SidecarEnhanceLabel, deploy.Name, deploy.Namespace)
92+
target.Spec.Template.Labels[config.SidecarEnhanceLabel] = "true"
9293
added = true
94+
} else {
95+
// Check if the x-live-enabled label exists in deploy's spec.template.metadata.labels; if not, add it.
96+
if _, ok := deploy.Spec.Template.Labels[config.WebHookMatchKey]; !ok {
97+
log.Infof("[mutation] /injection-deploy: add label %s to deployment %s/%s", config.WebHookMatchKey, deploy.Name, deploy.Namespace)
98+
target.Spec.Template.Labels[config.WebHookMatchKey] = config.WebHookMatchValue
99+
added = true
100+
}
101+
}
102+
103+
// Apm labels append
104+
if apmType, ok := deploy.Labels[config.ApmTypeLabel]; ok {
105+
if appender, ok := apm.AppenderTypes[apmType]; ok {
106+
added, err = appender.Modify(context.Background(), target)
107+
if err != nil {
108+
errMsg := fmt.Sprintf("[mutation] /injection-deploy: failed to modify deployment: %v", err)
109+
log.Error(errMsg)
110+
return &admissionv1.AdmissionResponse{
111+
Allowed: false,
112+
Result: &metav1.Status{
113+
Code: http.StatusInternalServerError,
114+
Message: errMsg,
115+
},
116+
}, nil
117+
}
118+
} else {
119+
log.Warnf("[mutation] /injection-deploy: unknown apm type %s", apmType)
120+
}
93121
}
94122

95123
if len(config.ControlPlaneUrl) == 0 {

0 commit comments

Comments
 (0)