Skip to content

Commit 8e1480e

Browse files
authored
Support for AWS Elasticsearch using AWS SDK v2 (#1)
Signed-off-by: Roshan Patil <[email protected]>
1 parent 23c72f7 commit 8e1480e

File tree

4 files changed

+142
-2
lines changed

4 files changed

+142
-2
lines changed

go.mod

+11
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ module github.com/prometheus-community/elasticsearch_exporter
33
go 1.17
44

55
require (
6+
github.com/aws/aws-sdk-go-v2 v1.16.5
7+
github.com/aws/aws-sdk-go-v2/config v1.15.11
68
github.com/blang/semver v3.5.2-0.20180723201105-3c1074078d32+incompatible
79
github.com/go-kit/log v0.2.1
810
github.com/imdario/mergo v0.3.12
@@ -14,6 +16,15 @@ require (
1416
require (
1517
github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect
1618
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d // indirect
19+
github.com/aws/aws-sdk-go-v2/credentials v1.12.6 // indirect
20+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.6 // indirect
21+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.12 // indirect
22+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.6 // indirect
23+
github.com/aws/aws-sdk-go-v2/internal/ini v1.3.13 // indirect
24+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.6 // indirect
25+
github.com/aws/aws-sdk-go-v2/service/sso v1.11.9 // indirect
26+
github.com/aws/aws-sdk-go-v2/service/sts v1.16.7 // indirect
27+
github.com/aws/smithy-go v1.11.3 // indirect
1728
github.com/beorn7/perks v1.0.1 // indirect
1829
github.com/cespare/xxhash/v2 v2.1.2 // indirect
1930
github.com/go-logfmt/logfmt v0.5.1 // indirect

go.sum

+27-2
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,28 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF
4040
github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
4141
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2cI+DC1Mbh0TJxzA3RcLoMsFw+aXw7E=
4242
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
43+
github.com/aws/aws-sdk-go-v2 v1.16.5 h1:Ah9h1TZD9E2S1LzHpViBO3Jz9FPL5+rmflmb8hXirtI=
44+
github.com/aws/aws-sdk-go-v2 v1.16.5/go.mod h1:Wh7MEsmEApyL5hrWzpDkba4gwAPc5/piwLVLFnCxp48=
45+
github.com/aws/aws-sdk-go-v2/config v1.15.11 h1:qfec8AtiCqVbwMcx51G1yO2PYVfWfhp2lWkDH65V9HA=
46+
github.com/aws/aws-sdk-go-v2/config v1.15.11/go.mod h1:mD5tNFciV7YHNjPpFYqJ6KGpoSfY107oZULvTHIxtbI=
47+
github.com/aws/aws-sdk-go-v2/credentials v1.12.6 h1:No1wZFW4bcM/uF6Tzzj6IbaeQJM+xxqXOYmoObm33ws=
48+
github.com/aws/aws-sdk-go-v2/credentials v1.12.6/go.mod h1:mQgnRmBPF2S/M01W4T4Obp3ZaZB6o1s/R8cOUda9vtI=
49+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.6 h1:+NZzDh/RpcQTpo9xMFUgkseIam6PC+YJbdhbQp1NOXI=
50+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.6/go.mod h1:ClLMcuQA/wcHPmOIfNzNI4Y1Q0oDbmEkbYhMFOzHDh8=
51+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.12 h1:Zt7DDk5V7SyQULUUwIKzsROtVzp/kVvcz15uQx/Tkow=
52+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.12/go.mod h1:Afj/U8svX6sJ77Q+FPWMzabJ9QjbwP32YlopgKALUpg=
53+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.6 h1:eeXdGVtXEe+2Jc49+/vAzna3FAQnUD4AagAw8tzbmfc=
54+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.6/go.mod h1:FwpAKI+FBPIELJIdmQzlLtRe8LQSOreMcM2wBsPMvvc=
55+
github.com/aws/aws-sdk-go-v2/internal/ini v1.3.13 h1:L/l0WbIpIadRO7i44jZh1/XeXpNDX0sokFppb4ZnXUI=
56+
github.com/aws/aws-sdk-go-v2/internal/ini v1.3.13/go.mod h1:hiM/y1XPp3DoEPhoVEYc/CZcS58dP6RKJRDFp99wdX0=
57+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.6 h1:0ZxYAZ1cn7Swi/US55VKciCE6RhRHIwCKIWaMLdT6pg=
58+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.6/go.mod h1:DxAPjquoEHf3rUHh1b9+47RAaXB8/7cB6jkzCt/GOEI=
59+
github.com/aws/aws-sdk-go-v2/service/sso v1.11.9 h1:Gju1UO3E8ceuoYc/AHcdXLuTZ0WGE1PT2BYDwcYhJg8=
60+
github.com/aws/aws-sdk-go-v2/service/sso v1.11.9/go.mod h1:UqRD9bBt15P0ofRyDZX6CfsIqPpzeHOhZKWzgSuAzpo=
61+
github.com/aws/aws-sdk-go-v2/service/sts v1.16.7 h1:HLzjwQM9975FQWSF3uENDGHT1gFQm/q3QXu2BYIcI08=
62+
github.com/aws/aws-sdk-go-v2/service/sts v1.16.7/go.mod h1:lVxTdiiSHY3jb1aeg+BBFtDzZGSUCv6qaNOyEGCJ1AY=
63+
github.com/aws/smithy-go v1.11.3 h1:DQixirEFM9IaKxX1olZ3ke3nvxRS2xMDteKIDWxozW8=
64+
github.com/aws/smithy-go v1.11.3/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA=
4365
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
4466
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
4567
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
@@ -116,8 +138,9 @@ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
116138
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
117139
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
118140
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
119-
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
120141
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
142+
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
143+
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
121144
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
122145
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
123146
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
@@ -136,6 +159,8 @@ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ
136159
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
137160
github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
138161
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
162+
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
163+
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
139164
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
140165
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
141166
github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
@@ -384,7 +409,6 @@ golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc
384409
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
385410
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
386411
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
387-
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
388412
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
389413
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
390414
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
@@ -472,6 +496,7 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
472496
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
473497
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
474498
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
499+
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
475500
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
476501
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
477502
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=

main.go

+8
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"github.com/go-kit/log/level"
2727
"github.com/prometheus-community/elasticsearch_exporter/collector"
2828
"github.com/prometheus-community/elasticsearch_exporter/pkg/clusterinfo"
29+
"github.com/prometheus-community/elasticsearch_exporter/pkg/roundtripper"
2930
"github.com/prometheus/client_golang/prometheus"
3031
"github.com/prometheus/client_golang/prometheus/promhttp"
3132
"github.com/prometheus/common/version"
@@ -112,6 +113,9 @@ func main() {
112113
logOutput = kingpin.Flag("log.output",
113114
"Sets the log output. Valid outputs are stdout and stderr").
114115
Default("stdout").String()
116+
awsRegion = kingpin.Flag("aws.region",
117+
"Region for AWS elasticsearch").
118+
Default("").String()
115119
)
116120

117121
kingpin.Version(version.Print(name))
@@ -160,6 +164,10 @@ func main() {
160164
Transport: httpTransport,
161165
}
162166

167+
if *awsRegion != "" {
168+
httpClient.Transport = roundtripper.NewAWSSigningTransport(httpTransport, awsRegion, logger)
169+
}
170+
163171
// version metric
164172
prometheus.MustRegister(version.NewCollector(name))
165173

pkg/roundtripper/roundtripper.go

+96
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
// Copyright 2021 The Prometheus Authors
2+
// Licensed under the Apache License, Version 2.0 (the "License");
3+
// you may not use this file except in compliance with the License.
4+
// You may obtain a copy of the License at
5+
//
6+
// http://www.apache.org/licenses/LICENSE-2.0
7+
//
8+
// Unless required by applicable law or agreed to in writing, software
9+
// distributed under the License is distributed on an "AS IS" BASIS,
10+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
// See the License for the specific language governing permissions and
12+
// limitations under the License.
13+
14+
package roundtripper
15+
16+
import (
17+
"bytes"
18+
"context"
19+
"crypto/sha256"
20+
"encoding/hex"
21+
"io"
22+
"io/ioutil"
23+
"net/http"
24+
"os"
25+
"time"
26+
27+
"github.com/aws/aws-sdk-go-v2/aws"
28+
v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4"
29+
"github.com/aws/aws-sdk-go-v2/config"
30+
"github.com/go-kit/log"
31+
"github.com/go-kit/log/level"
32+
)
33+
34+
const (
35+
service = "es"
36+
)
37+
38+
type AWSSigningTransport struct {
39+
t http.RoundTripper
40+
creds aws.Credentials
41+
region *string
42+
log log.Logger
43+
}
44+
45+
func NewAWSSigningTransport(transport http.RoundTripper, region *string, log log.Logger) *AWSSigningTransport {
46+
cfg, err := config.LoadDefaultConfig(context.Background(), config.WithRegion(*region))
47+
if err != nil {
48+
_ = level.Error(log).Log("msg", "fail to load aws default config", "err", err)
49+
os.Exit(1)
50+
}
51+
52+
creds, err := cfg.Credentials.Retrieve(context.Background())
53+
if err != nil {
54+
_ = level.Error(log).Log("msg", "fail to retrive aws credentials", "err", err)
55+
os.Exit(1)
56+
}
57+
58+
return &AWSSigningTransport{
59+
t: transport,
60+
region: region,
61+
creds: creds,
62+
log: log,
63+
}
64+
}
65+
66+
func (a *AWSSigningTransport) RoundTrip(req *http.Request) (*http.Response, error) {
67+
signer := v4.NewSigner()
68+
payloadHash, newReader, err := hashPayload(req.Body)
69+
if err != nil {
70+
_ = level.Error(a.log).Log("msg", "fail to hash request body", "err", err)
71+
return nil, err
72+
}
73+
req.Body = newReader
74+
err = signer.SignHTTP(context.Background(), a.creds, req, payloadHash, service, *a.region, time.Now())
75+
if err != nil {
76+
_ = level.Error(a.log).Log("msg", "fail to sign request body", "err", err)
77+
return nil, err
78+
}
79+
return a.t.RoundTrip(req)
80+
}
81+
82+
func hashPayload(r io.ReadCloser) (payloadHash string, newReader io.ReadCloser, err error) {
83+
var payload []byte
84+
if r == nil {
85+
payload = []byte("")
86+
} else {
87+
payload, err = ioutil.ReadAll(r)
88+
if err != nil {
89+
return
90+
}
91+
newReader = ioutil.NopCloser(bytes.NewReader(payload))
92+
}
93+
hash := sha256.Sum256(payload)
94+
payloadHash = hex.EncodeToString(hash[:])
95+
return
96+
}

0 commit comments

Comments
 (0)