...
1
2
3
4
5 package pprof
6
7 import (
8 "context"
9 )
10
11 type label struct {
12 key string
13 value string
14 }
15
16
17 type LabelSet struct {
18 list []label
19 }
20
21
22 type labelContextKey struct{}
23
24 func labelValue(ctx context.Context) labelMap {
25 labels, _ := ctx.Value(labelContextKey{}).(*labelMap)
26 if labels == nil {
27 return labelMap(nil)
28 }
29 return *labels
30 }
31
32
33
34
35 type labelMap map[string]string
36
37
38
39 func WithLabels(ctx context.Context, labels LabelSet) context.Context {
40 childLabels := make(labelMap)
41 parentLabels := labelValue(ctx)
42
43
44
45 for k, v := range parentLabels {
46 childLabels[k] = v
47 }
48 for _, label := range labels.list {
49 childLabels[label.key] = label.value
50 }
51 return context.WithValue(ctx, labelContextKey{}, &childLabels)
52 }
53
54
55
56
57 func Labels(args ...string) LabelSet {
58 if len(args)%2 != 0 {
59 panic("uneven number of arguments to pprof.Labels")
60 }
61 labels := LabelSet{}
62 for i := 0; i+1 < len(args); i += 2 {
63 labels.list = append(labels.list, label{key: args[i], value: args[i+1]})
64 }
65 return labels
66 }
67
68
69
70 func Label(ctx context.Context, key string) (string, bool) {
71 ctxLabels := labelValue(ctx)
72 v, ok := ctxLabels[key]
73 return v, ok
74 }
75
76
77
78 func ForLabels(ctx context.Context, f func(key, value string) bool) {
79 ctxLabels := labelValue(ctx)
80 for k, v := range ctxLabels {
81 if !f(k, v) {
82 break
83 }
84 }
85 }
86
View as plain text