15
15
package datadogexporter
16
16
17
17
import (
18
+ "bytes"
18
19
"context"
20
+ "encoding/json"
21
+ "fmt"
22
+ "net"
23
+ "net/http"
24
+ "time"
19
25
20
26
"go.opentelemetry.io/collector/consumer/pdata"
21
27
"go.uber.org/zap"
@@ -26,23 +32,65 @@ type metricsExporter struct {
26
32
logger * zap.Logger
27
33
cfg * Config
28
34
client * datadog.Client
29
- tags []string
35
+ }
36
+
37
+ func newHTTPClient () * http.Client {
38
+ return & http.Client {
39
+ Timeout : 20 * time .Second ,
40
+ Transport : & http.Transport {
41
+ Proxy : http .ProxyFromEnvironment ,
42
+ DialContext : (& net.Dialer {
43
+ // Disable RFC 6555 Fast Fallback ("Happy Eyeballs")
44
+ FallbackDelay : - 1 * time .Nanosecond ,
45
+ }).DialContext ,
46
+ MaxIdleConns : 100 ,
47
+ // Not supported by intake
48
+ ForceAttemptHTTP2 : false ,
49
+ },
50
+ }
30
51
}
31
52
32
53
func newMetricsExporter (logger * zap.Logger , cfg * Config ) (* metricsExporter , error ) {
33
54
client := datadog .NewClient (cfg .API .Key , "" )
55
+ client .ExtraHeader ["User-Agent" ] = userAgent
34
56
client .SetBaseUrl (cfg .Metrics .TCPAddr .Endpoint )
57
+ client .HttpClient = newHTTPClient ()
35
58
36
- // Calculate tags at startup
37
- tags := cfg .TagsConfig .GetTags (false )
59
+ return & metricsExporter {logger , cfg , client }, nil
60
+ }
61
+
62
+ // pushHostMetadata sends a host metadata payload to the "/intake" endpoint
63
+ func (exp * metricsExporter ) pushHostMetadata (metadata hostMetadata ) error {
64
+ path := exp .cfg .Metrics .TCPAddr .Endpoint + "/intake"
65
+ buf , _ := json .Marshal (metadata )
66
+ req , _ := http .NewRequest (http .MethodPost , path , bytes .NewBuffer (buf ))
67
+ req .Header .Set ("DD-API-KEY" , exp .cfg .API .Key )
68
+ req .Header .Set ("Content-Type" , "application/json" )
69
+ req .Header .Set ("User-Agent" , userAgent )
70
+ client := newHTTPClient ()
71
+ resp , err := client .Do (req )
72
+
73
+ if err != nil {
74
+ return err
75
+ }
38
76
39
- return & metricsExporter {logger , cfg , client , tags }, nil
77
+ defer resp .Body .Close ()
78
+
79
+ if resp .StatusCode >= 400 {
80
+ return fmt .Errorf (
81
+ "'%d - %s' error when sending metadata payload to %s" ,
82
+ resp .StatusCode ,
83
+ resp .Status ,
84
+ path ,
85
+ )
86
+ }
87
+
88
+ return nil
40
89
}
41
90
42
91
func (exp * metricsExporter ) processMetrics (metrics []datadog.Metric ) {
43
92
addNamespace := exp .cfg .Metrics .Namespace != ""
44
93
overrideHostname := exp .cfg .Hostname != ""
45
- addTags := len (exp .tags ) > 0
46
94
47
95
for i := range metrics {
48
96
if addNamespace {
@@ -53,11 +101,6 @@ func (exp *metricsExporter) processMetrics(metrics []datadog.Metric) {
53
101
if overrideHostname || metrics [i ].GetHost () == "" {
54
102
metrics [i ].Host = GetHost (exp .cfg )
55
103
}
56
-
57
- if addTags {
58
- metrics [i ].Tags = append (metrics [i ].Tags , exp .tags ... )
59
- }
60
-
61
104
}
62
105
}
63
106
0 commit comments