Skip to content

Commit c82e821

Browse files
committed
Use a different struct for scrape target serialization
1 parent 11c1fa9 commit c82e821

File tree

4 files changed

+69
-40
lines changed

4 files changed

+69
-40
lines changed

cmd/otel-allocator/server/bench_test.go

+11-2
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ func BenchmarkTargetItemsJSONHandler(b *testing.B) {
198198
},
199199
}
200200
for _, tc := range tests {
201-
data := makeNTargetItems(*random, tc.numTargets, tc.numLabels)
201+
data := makeNTargetJSON(*random, tc.numTargets, tc.numLabels)
202202
b.Run(fmt.Sprintf("%d_targets_%d_labels", tc.numTargets, tc.numLabels), func(b *testing.B) {
203203
b.ReportAllocs()
204204
for i := 0; i < b.N; i++ {
@@ -242,7 +242,7 @@ func makeNCollectorJSON(random rand.Rand, numCollectors, numItems int) map[strin
242242
for i := 0; i < numCollectors; i++ {
243243
items[randSeq(random, 20)] = collectorJSON{
244244
Link: randSeq(random, 120),
245-
Jobs: makeNTargetItems(random, numItems, 50),
245+
Jobs: makeNTargetJSON(random, numItems, 50),
246246
}
247247
}
248248
return items
@@ -261,6 +261,15 @@ func makeNTargetItems(random rand.Rand, numItems, numLabels int) []*target.Item
261261
return items
262262
}
263263

264+
func makeNTargetJSON(random rand.Rand, numItems, numLabels int) []*targetJSON {
265+
items := makeNTargetItems(random, numItems, numLabels)
266+
targets := make([]*targetJSON, numItems)
267+
for i := 0; i < numItems; i++ {
268+
targets[i] = targetJsonFromTargetItem(items[i])
269+
}
270+
return targets
271+
}
272+
264273
func makeNNewLabels(random rand.Rand, n int) model.LabelSet {
265274
labels := make(map[model.LabelName]model.LabelValue, n)
266275
for i := 0; i < n; i++ {

cmd/otel-allocator/server/server.go

+40-10
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
"github.com/prometheus/client_golang/prometheus/promauto"
3535
"github.com/prometheus/client_golang/prometheus/promhttp"
3636
promcommconfig "github.com/prometheus/common/config"
37+
"github.com/prometheus/common/model"
3738
promconfig "github.com/prometheus/prometheus/config"
3839
"gopkg.in/yaml.v2"
3940

@@ -57,8 +58,17 @@ var (
5758
)
5859

5960
type collectorJSON struct {
60-
Link string `json:"_link"`
61-
Jobs []*target.Item `json:"targets"`
61+
Link string `json:"_link"`
62+
Jobs []*targetJSON `json:"targets"`
63+
}
64+
65+
type linkJSON struct {
66+
Link string `json:"_link"`
67+
}
68+
69+
type targetJSON struct {
70+
TargetURL []string `json:"targets"`
71+
Labels model.LabelSet `json:"labels"`
6272
}
6373

6474
type Server struct {
@@ -263,9 +273,9 @@ func (s *Server) ReadinessProbeHandler(c *gin.Context) {
263273
}
264274

265275
func (s *Server) JobHandler(c *gin.Context) {
266-
displayData := make(map[string]target.LinkJSON)
276+
displayData := make(map[string]linkJSON)
267277
for _, v := range s.allocator.TargetItems() {
268-
displayData[v.JobName] = target.LinkJSON{Link: v.Link.Link}
278+
displayData[v.JobName] = linkJSON{Link: fmt.Sprintf("/jobs/%s/targets", url.QueryEscape(v.JobName))}
269279
}
270280
s.jsonHandler(c.Writer, displayData)
271281
}
@@ -294,16 +304,16 @@ func (s *Server) TargetsHandler(c *gin.Context) {
294304
if len(q) == 0 {
295305
displayData := GetAllTargetsByJob(s.allocator, jobId)
296306
s.jsonHandler(c.Writer, displayData)
297-
298307
} else {
299-
tgs := s.allocator.GetTargetsForCollectorAndJob(q[0], jobId)
308+
targets := GetAllTargetsByCollectorAndJob(s.allocator, q[0], jobId)
300309
// Displays empty list if nothing matches
301-
if len(tgs) == 0 {
310+
if len(targets) == 0 {
302311
s.jsonHandler(c.Writer, []interface{}{})
303312
return
304313
}
305-
s.jsonHandler(c.Writer, tgs)
314+
s.jsonHandler(c.Writer, targets)
306315
}
316+
307317
}
308318

309319
func (s *Server) errorHandler(w http.ResponseWriter, err error) {
@@ -323,12 +333,25 @@ func (s *Server) jsonHandler(w http.ResponseWriter, data interface{}) {
323333
func GetAllTargetsByJob(allocator allocation.Allocator, job string) map[string]collectorJSON {
324334
displayData := make(map[string]collectorJSON)
325335
for _, col := range allocator.Collectors() {
326-
items := allocator.GetTargetsForCollectorAndJob(col.Name, job)
327-
displayData[col.Name] = collectorJSON{Link: fmt.Sprintf("/jobs/%s/targets?collector_id=%s", url.QueryEscape(job), col.Name), Jobs: items}
336+
targets := GetAllTargetsByCollectorAndJob(allocator, col.Name, job)
337+
displayData[col.Name] = collectorJSON{
338+
Link: fmt.Sprintf("/jobs/%s/targets?collector_id=%s", url.QueryEscape(job), col.Name),
339+
Jobs: targets,
340+
}
328341
}
329342
return displayData
330343
}
331344

345+
// GetAllTargetsByCollector returns all the targets for a given collector and job.
346+
func GetAllTargetsByCollectorAndJob(allocator allocation.Allocator, collectorName string, jobName string) []*targetJSON {
347+
items := allocator.GetTargetsForCollectorAndJob(collectorName, jobName)
348+
targets := make([]*targetJSON, len(items))
349+
for i, item := range items {
350+
targets[i] = targetJsonFromTargetItem(item)
351+
}
352+
return targets
353+
}
354+
332355
// registerPprof registers the pprof handlers and either serves the requested
333356
// specific profile or falls back to index handler.
334357
func registerPprof(g *gin.RouterGroup) {
@@ -348,3 +371,10 @@ func registerPprof(g *gin.RouterGroup) {
348371
}
349372
})
350373
}
374+
375+
func targetJsonFromTargetItem(item *target.Item) *targetJSON {
376+
return &targetJSON{
377+
TargetURL: item.TargetURL,
378+
Labels: item.Labels,
379+
}
380+
}

cmd/otel-allocator/server/server_test.go

+14-14
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ func TestServer_TargetsHandler(t *testing.T) {
7474
allocator allocation.Allocator
7575
}
7676
type want struct {
77-
items []*target.Item
77+
items []*targetJSON
7878
errString string
7979
}
8080
tests := []struct {
@@ -91,7 +91,7 @@ func TestServer_TargetsHandler(t *testing.T) {
9191
allocator: leastWeighted,
9292
},
9393
want: want{
94-
items: []*target.Item{},
94+
items: []*targetJSON{},
9595
},
9696
},
9797
{
@@ -105,7 +105,7 @@ func TestServer_TargetsHandler(t *testing.T) {
105105
allocator: leastWeighted,
106106
},
107107
want: want{
108-
items: []*target.Item{
108+
items: []*targetJSON{
109109
{
110110
TargetURL: []string{"test-url"},
111111
Labels: map[model.LabelName]model.LabelValue{
@@ -127,7 +127,7 @@ func TestServer_TargetsHandler(t *testing.T) {
127127
allocator: leastWeighted,
128128
},
129129
want: want{
130-
items: []*target.Item{
130+
items: []*targetJSON{
131131
{
132132
TargetURL: []string{"test-url"},
133133
Labels: map[model.LabelName]model.LabelValue{
@@ -149,7 +149,7 @@ func TestServer_TargetsHandler(t *testing.T) {
149149
allocator: leastWeighted,
150150
},
151151
want: want{
152-
items: []*target.Item{
152+
items: []*targetJSON{
153153
{
154154
TargetURL: []string{"test-url"},
155155
Labels: map[model.LabelName]model.LabelValue{
@@ -186,7 +186,7 @@ func TestServer_TargetsHandler(t *testing.T) {
186186
assert.EqualError(t, err, tt.want.errString)
187187
return
188188
}
189-
var itemResponse []*target.Item
189+
var itemResponse []*targetJSON
190190
err = json.Unmarshal(bodyBytes, &itemResponse)
191191
assert.NoError(t, err)
192192
assert.ElementsMatch(t, tt.want.items, itemResponse)
@@ -555,27 +555,27 @@ func TestServer_JobHandler(t *testing.T) {
555555
description string
556556
targetItems map[string]*target.Item
557557
expectedCode int
558-
expectedJobs map[string]target.LinkJSON
558+
expectedJobs map[string]linkJSON
559559
}{
560560
{
561561
description: "nil jobs",
562562
targetItems: nil,
563563
expectedCode: http.StatusOK,
564-
expectedJobs: make(map[string]target.LinkJSON),
564+
expectedJobs: make(map[string]linkJSON),
565565
},
566566
{
567567
description: "empty jobs",
568568
targetItems: map[string]*target.Item{},
569569
expectedCode: http.StatusOK,
570-
expectedJobs: make(map[string]target.LinkJSON),
570+
expectedJobs: make(map[string]linkJSON),
571571
},
572572
{
573573
description: "one job",
574574
targetItems: map[string]*target.Item{
575575
"targetitem": target.NewItem("job1", "", model.LabelSet{}, ""),
576576
},
577577
expectedCode: http.StatusOK,
578-
expectedJobs: map[string]target.LinkJSON{
578+
expectedJobs: map[string]linkJSON{
579579
"job1": newLink("job1"),
580580
},
581581
},
@@ -588,7 +588,7 @@ func TestServer_JobHandler(t *testing.T) {
588588
"d": target.NewItem("job3", "", model.LabelSet{}, ""),
589589
"e": target.NewItem("job3", "", model.LabelSet{}, "")},
590590
expectedCode: http.StatusOK,
591-
expectedJobs: map[string]target.LinkJSON{
591+
expectedJobs: map[string]linkJSON{
592592
"job1": newLink("job1"),
593593
"job2": newLink("job2"),
594594
"job3": newLink("job3"),
@@ -609,7 +609,7 @@ func TestServer_JobHandler(t *testing.T) {
609609
assert.Equal(t, tc.expectedCode, result.StatusCode)
610610
bodyBytes, err := io.ReadAll(result.Body)
611611
require.NoError(t, err)
612-
jobs := map[string]target.LinkJSON{}
612+
jobs := map[string]linkJSON{}
613613
err = json.Unmarshal(bodyBytes, &jobs)
614614
require.NoError(t, err)
615615
assert.Equal(t, tc.expectedJobs, jobs)
@@ -737,6 +737,6 @@ func TestServer_ScrapeConfigRespose(t *testing.T) {
737737
}
738738
}
739739

740-
func newLink(jobName string) target.LinkJSON {
741-
return target.LinkJSON{Link: fmt.Sprintf("/jobs/%s/targets", url.QueryEscape(jobName))}
740+
func newLink(jobName string) linkJSON {
741+
return linkJSON{Link: fmt.Sprintf("/jobs/%s/targets", url.QueryEscape(jobName))}
742742
}

cmd/otel-allocator/target/target.go

+4-14
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@
1515
package target
1616

1717
import (
18-
"fmt"
19-
"net/url"
20-
2118
"github.com/prometheus/common/model"
2219
)
2320

@@ -34,17 +31,11 @@ var (
3431
endpointSliceTargetNameLabel model.LabelName = "__meta_kubernetes_endpointslice_address_target_name"
3532
)
3633

37-
// LinkJSON This package contains common structs and methods that relate to scrape targets.
38-
type LinkJSON struct {
39-
Link string `json:"_link"`
40-
}
41-
4234
type Item struct {
43-
JobName string `json:"-"`
44-
Link LinkJSON `json:"-"`
45-
TargetURL []string `json:"targets"`
46-
Labels model.LabelSet `json:"labels"`
47-
CollectorName string `json:"-"`
35+
JobName string
36+
TargetURL []string
37+
Labels model.LabelSet
38+
CollectorName string
4839
hash string
4940
}
5041

@@ -73,7 +64,6 @@ func (t *Item) GetNodeName() string {
7364
func NewItem(jobName string, targetURL string, label model.LabelSet, collectorName string) *Item {
7465
return &Item{
7566
JobName: jobName,
76-
Link: LinkJSON{Link: fmt.Sprintf("/jobs/%s/targets", url.QueryEscape(jobName))},
7767
hash: jobName + targetURL + label.Fingerprint().String(),
7868
TargetURL: []string{targetURL},
7969
Labels: label,

0 commit comments

Comments
 (0)