-
Notifications
You must be signed in to change notification settings - Fork 2.5k
/
Copy pathscraper.go
98 lines (83 loc) · 2.93 KB
/
scraper.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
package saphanareceiver // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/saphanareceiver"
import (
"context"
"encoding/json"
"fmt"
"time"
"go.opentelemetry.io/collector/pdata/pcommon"
"go.opentelemetry.io/collector/pdata/pmetric"
"go.opentelemetry.io/collector/receiver"
"go.opentelemetry.io/collector/scraper"
"go.opentelemetry.io/collector/scraper/scrapererror"
"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/saphanareceiver/internal/metadata"
)
// Runs intermittently, fetching info from SAP HANA, creating metrics/datapoints,
// and feeding them to a metricsConsumer.
type sapHanaScraper struct {
settings receiver.Settings
cfg *Config
mbs map[string]*metadata.MetricsBuilder
factory sapHanaConnectionFactory
}
func newSapHanaScraper(settings receiver.Settings, cfg *Config, factory sapHanaConnectionFactory) (scraper.Metrics, error) {
rs := &sapHanaScraper{
settings: settings,
cfg: cfg,
mbs: make(map[string]*metadata.MetricsBuilder),
factory: factory,
}
return scraper.NewMetrics(rs.scrape)
}
func (s *sapHanaScraper) getMetricsBuilder(resourceAttributes map[string]string) (*metadata.MetricsBuilder, error) {
bytes, err := json.Marshal(resourceAttributes)
if err != nil {
return nil, fmt.Errorf("Error accessing MetricsBuilder for sap hana collection: %w", err)
}
key := string(bytes)
mb, ok := s.mbs[key]
if !ok {
mb = metadata.NewMetricsBuilder(s.cfg.MetricsBuilderConfig, s.settings)
s.mbs[key] = mb
}
return mb, nil
}
// Scrape is called periodically, querying SAP HANA and building Metrics to send to
// the next consumer.
func (s *sapHanaScraper) scrape(ctx context.Context) (pmetric.Metrics, error) {
client := newSapHanaClient(s.cfg, s.factory)
if err := client.Connect(ctx); err != nil {
return pmetric.NewMetrics(), err
}
defer client.Close()
errs := &scrapererror.ScrapeErrors{}
now := pcommon.NewTimestampFromTime(time.Now())
for _, query := range queries {
if query.Enabled == nil || query.Enabled(s.cfg) {
query.CollectMetrics(ctx, s, client, now, errs)
}
}
metrics := pmetric.NewMetrics()
for k, mb := range s.mbs {
var resourceAttributes map[string]string
err := json.Unmarshal([]byte(k), &resourceAttributes)
if err != nil {
errs.Add(fmt.Errorf("Error unmarshaling resource attributes for saphana scraper: %w", err))
continue
}
rb := mb.NewResourceBuilder()
rb.SetDbSystem("saphana")
for attribute, value := range resourceAttributes {
if attribute == "host" {
rb.SetSaphanaHost(value)
} else {
errs.Add(fmt.Errorf("Unsupported resource attribute: %s", attribute))
}
}
resourceMetrics := mb.Emit(metadata.WithResource(rb.Emit()))
resourceMetrics.ResourceMetrics().At(0).MoveTo(metrics.ResourceMetrics().AppendEmpty())
}
s.mbs = make(map[string]*metadata.MetricsBuilder)
return metrics, errs.Combine()
}