Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions processor/resourcedetectionprocessor/e2e_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,48 @@ func TestE2ESystemDetector(t *testing.T) {
}, 3*time.Minute, 1*time.Second)
}

// TestE2EEKSDetector validates the eks detector using mocked Kubernetes and EC2 metadata endpoints.
func TestE2EEKSDetector(t *testing.T) {
var expected pmetric.Metrics
expectedFile := filepath.Join("testdata", "e2e", "eks", "expected.yaml")
expected, err := golden.ReadMetrics(expectedFile)
require.NoError(t, err)

k8sClient, err := k8stest.NewK8sClient(testKubeConfig)
require.NoError(t, err)

metricsConsumer := new(consumertest.MetricsSink)
shutdownSink := startUpSink(t, metricsConsumer)
defer shutdownSink()

testID := uuid.NewString()[:8]
collectorObjs := k8stest.CreateCollectorObjects(t, k8sClient, testID, filepath.Join(".", "testdata", "e2e", "eks", "collector"), map[string]string{}, "")

defer func() {
for _, obj := range collectorObjs {
require.NoErrorf(t, k8stest.DeleteObject(k8sClient, obj), "failed to delete object %s", obj.GetName())
}
}()

wantEntries := 10
waitForData(t, wantEntries, metricsConsumer)

require.EventuallyWithT(t, func(tt *assert.CollectT) {
assert.NoError(tt, pmetrictest.CompareMetrics(expected, metricsConsumer.AllMetrics()[len(metricsConsumer.AllMetrics())-1],
pmetrictest.IgnoreTimestamp(),
pmetrictest.IgnoreStartTimestamp(),
pmetrictest.IgnoreScopeVersion(),
pmetrictest.IgnoreResourceMetricsOrder(),
pmetrictest.IgnoreMetricsOrder(),
pmetrictest.IgnoreScopeMetricsOrder(),
pmetrictest.IgnoreMetricDataPointsOrder(),
pmetrictest.IgnoreMetricValues(),
pmetrictest.IgnoreSubsequentDataPoints("system.cpu.time"),
),
)
}, 3*time.Minute, 1*time.Second)
}

// TestE2EGCPDetector validates that the gcp detector can populate Compute Engine
// metadata by pointing the metadata client to a fake metadata server.
func TestE2EGCPDetector(t *testing.T) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
apiVersion: v1
kind: Secret
metadata:
name: {{ .Name }}-eks-api-cert
namespace: default
type: Opaque
stringData:
ca.crt: |
-----BEGIN CERTIFICATE-----
MIIDDTCCAfWgAwIBAgIUHKur5/XvROOXy9Wd3R8HY8zCKr4wDQYJKoZIhvcNAQEL
BQAwFjEUMBIGA1UEAwwLZmFrZS1la3MtY2EwHhcNMjYwMTEzMTUyNDMxWhcNMzYw
MTExMTUyNDMxWjAWMRQwEgYDVQQDDAtmYWtlLWVrcy1jYTCCASIwDQYJKoZIhvcN
AQEBBQADggEPADCCAQoCggEBAI08VJ8dm6CG7dMzzLGESt9xWu9mmXh6oHT1Ajw1
QpuLLxl28IjUhAxvdGN7+/+Key3E5eIb4yHLELxrkd2AYQYUHC4F0+r1Hi2It5Fi
CB9+kzo1THQ0Uhwh7h239XWgm9J0SIh5Ew1YU23++1YBQser1HfUg8b92wKkr2KQ
AGHZtoTC2HAnhGyhoIF14v8+uGBjJA7FhprSVjtRKJ87JU92IqbcHhH1hZzI1eTS
LP5u5j6xfQIub86FOGMlWEDDqj+YBv0pqtXrzdJXzjwUiekyaHXmO+fL5I7Il5SX
WoIuAiGH7Ok3RUwriuKciBMzen8sJ+7/J4qskpB8B1ThyJUCAwEAAaNTMFEwHQYD
VR0OBBYEFIJq4GRDFkNgIxskxIKF5gY7EfhfMB8GA1UdIwQYMBaAFIJq4GRDFkNg
IxskxIKF5gY7EfhfMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB
AIW/TBnMsJfmQKl/SEIbfABJjbCiw8ctGKJ7qYcwS8C6zwi6cA//MV6293FmuCGY
yTdSWhtLF1Iik9kqnBdySIsFZxibBNu8JOggIQcAoSAwfPUbZvlZ1Bv6K8s3pv26
jojObrjmXyAPtrZXkseroPrIDsNAPe5U3V9ZISKQFk0Jz0ALRumioeXDz37B2D61
121dLqmRo931CJ8ycj9Ziy1gqWdSZbVvnWGo/115OwLQf5WIHTI0DdCyzK/n5bYs
iZCYuTOJqfj+boNa98InV4TYDlC3nYRnY4dl/PFW74Q3PsiWB5VbeLDJXVGyDp+Y
eoULusLKrB+wAJMMSr/4jEU=
-----END CERTIFICATE-----
tls.crt: |
-----BEGIN CERTIFICATE-----
MIIDgDCCAmigAwIBAgIUTJl4wWhguJflswUZHVd/WwA3yC4wDQYJKoZIhvcNAQEL
BQAwFjEUMBIGA1UEAwwLZmFrZS1la3MtY2EwHhcNMjYwMTEzMTUyNDMxWhcNMzYw
MTExMTUyNDMxWjAeMRwwGgYDVQQDDBNla3MtYXBpLmRlZmF1bHQuc3ZjMIIBIjAN
BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/YZ6fk2Yn7lNgpBr+ZIrgZ9n1Ov0
cU4ywlgg9snkSqouqWAxXXTZbflGWBVimGHbBEaPZaUhXuAxExfxHQNF/PQ5x66l
nBqHCIZObRJBat1F1OrC19zGPOYIDUSK+3MNyHs0dIsduYhGIMvkQTQj2/Bvauzu
u+6dDz91poAL4Gz4tW9uDFlsW8AWU019luyjDZHu3cFzmh/IZJ5avUJ9YTP09RKi
HveOIHSBCv9AaNe+w3124Mo31HL5XIYPlerOxodIIMQy+GZhmSEoi4ImtE42q1YX
v5YoBanPuaxF7nujbLWTv4hv6bu1Tu4dnNItjQOcyYm0CfOvYjxClkuWPQIDAQAB
o4G9MIG6MHgGA1UdEQRxMG+CE2Vrcy1hcGkuZGVmYXVsdC5zdmOCIWVrcy1hcGku
ZGVmYXVsdC5zdmMuY2x1c3Rlci5sb2NhbIIbKi5kZWZhdWx0LnN2Yy5jbHVzdGVy
LmxvY2Fsgg0qLmRlZmF1bHQuc3Zjgglsb2NhbGhvc3QwHQYDVR0OBBYEFH0o23zu
BaCD8d0xqpPU/nVnNDN8MB8GA1UdIwQYMBaAFIJq4GRDFkNgIxskxIKF5gY7Efhf
MA0GCSqGSIb3DQEBCwUAA4IBAQAcuArXH0UInLURg/5xNoC8+cLaSM5rgyi43cBN
g7Sl8q8Rr3yi6nhKRJwYd4F1SoPqeV7iCEqw8fcqztcahEHYB8YOa1mD/fLZTPb9
aM3HDOuWUFur1cJBTRF9C4sbqoOymCSMkNlQuq1kSkcyFoxUpVsJytgzpnC/N65t
gl0SMGyA0bU7p9xACIvf9JyHNv2cahPtxUHeniSm30waQPMyhiBF3XuG2KQVx8wI
1DNAk4+iMv98TYXK1IkdQEKc/oWbswKc8J6MrG7hf/LDdP57SwDgk32Ct6yArmvt
NbGm9LPqKTUDo4gvloAttZYM9Wsh4prcqTEQkCrysIheUtWs
-----END CERTIFICATE-----
tls.key: |
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQD9hnp+TZifuU2C
kGv5kiuBn2fU6/RxTjLCWCD2yeRKqi6pYDFddNlt+UZYFWKYYdsERo9lpSFe4DET
F/EdA0X89DnHrqWcGocIhk5tEkFq3UXU6sLX3MY85ggNRIr7cw3IezR0ix25iEYg
y+RBNCPb8G9q7O677p0PP3WmgAvgbPi1b24MWWxbwBZTTX2W7KMNke7dwXOaH8hk
nlq9Qn1hM/T1EqIe944gdIEK/0Bo177DfXbgyjfUcvlchg+V6s7Gh0ggxDL4ZmGZ
ISiLgia0TjarVhe/ligFqc+5rEXue6NstZO/iG/pu7VO7h2c0i2NA5zJibQJ869i
PEKWS5Y9AgMBAAECggEAbLPwaZ9TxYhqV4UdBtFJnjZ/CqhxEvP4h6PJ3ocKP4lg
oHcCM5QadjDfnHzu3W93vQmUCn0XJdryr8EgPNReeestqxSTJa+qHlmX3uRo8C0X
+AcArBWZWhs3cJjnDpFyY3eQMjhD8n0ftIg3wk1c4rzgyPP2GNZiuVr4Uv+sF/lG
4n+23UG50WqiX7GuvpnJpKu9XaTPNRe3WHZhU7xUTE+Lh3qj2SzqUgPC8rVjtmwW
trf9Iipe5ZEbEylMxT36ZnJLxT/rEhHr/Km0l0wLrq6nZBVPtvaQJ2VnC5K1H90d
QHo16NP0HOvYPZBhSgNwgcKAlXBpsAe+yKGa2WxU8QKBgQD/bHgJ2OAVSoYVYN8v
S45ka0CzLUuEzGHE2yLY85p68o+MYUNGZQPFODjFnuYOEkud3uGolfDQ171WgplZ
C3/Jso9X9JuFD91BuTB4hsoI7ZHEVf3sWcug112Hrn8bUXLTy9juGguKktKsgRCW
NwoXOopixupMoaFTeQ2ZAqcZ4wKBgQD+GOm//OErdHO6hW87KP/JYUshAG3xxkgV
+YYPA80t5pu8qAPgVn9ACyAHKUMVASrR5i/6OI9qtGj1NMT0y7IeupJbKxGJREkm
vRY/Qo3j4fkQ5qEgdnXiDCy8yuobr31gZSO45WzjumU3N69nmVbgq2+MXjoa6cjX
Jt+y6iAJXwKBgDjG+8f0lZsl/bgy2GnC+dwIm1E4+FiEthb0P0LKo8RAtvgVhsbX
HYdxf+0t7SWjm3t0V+UJr4Y87rGURlIs5DMJpiN/FDL3288IQ2YHUFG7vXNPSiqH
q2QNe5T1jPudl1DNN2N2FqqvCHWgGvfJNE0Fjk12ug5ev2W2uvcQR+TRAoGAG7DP
WHLQfxHTwtHjy0iuh12o+FG5qY14MZzdtSku5P+qnSaaNYp3l50ewmkGvHVCG1nA
hL5BMtmyTnaPuDWylZKzfGf3I0RjzGryz7YLDHiF0gewK399XUMCZRif5qB7Q1QC
TpYCBdc8TIYvAVU+mIFWSK/EGUa88mV0H2VQVHUCgYEAvGD1lQ6ssH0Fax0w2tsf
zv5lVuDW9kd1QBAkzXLZXksvJsXW0ozyKJf4AWz0P8XqaNcIzezsats8f8xsXg80
PJ/GvHH/g4ynRl41aJ49BjpEOC3D3jCEd35rETJECLZ9hbGH7oGuJTtvSu7c1uYS
pYobVTFrCAAW5JK0Pp90HZg=
-----END PRIVATE KEY-----
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Name }}-eks-api-config
namespace: default
data:
server.py: |
import json
import os
import ssl
from http.server import BaseHTTPRequestHandler, HTTPServer

NODE_NAME = os.environ.get("FAKE_NODE_NAME", "fake-node")
PROVIDER_ID = os.environ.get("FAKE_PROVIDER_ID", "aws:///us-west-2a/i-0abc123456789")

class Handler(BaseHTTPRequestHandler):
def do_GET(self):
if self.path == "/healthz":
body = b"ok"
self.send_response(200)
self.send_header("Content-Type", "text/plain; charset=utf-8")
self.send_header("Content-Length", str(len(body)))
self.end_headers()
self.wfile.write(body)
return

if self.path == "/version":
payload = {"gitVersion": "v1.29.0-eks-123456"}
body = json.dumps(payload).encode("utf-8")
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.send_header("Content-Length", str(len(body)))
self.end_headers()
self.wfile.write(body)
return

if self.path.startswith("/api/v1/nodes/"):
node_name = self.path.split("/")[-1]
payload = {
"apiVersion": "v1",
"kind": "Node",
"metadata": {"name": node_name},
"spec": {"providerID": PROVIDER_ID},
}
body = json.dumps(payload).encode("utf-8")
self.send_response(200)
self.send_header("Content-Type", "application/json")
self.send_header("Content-Length", str(len(body)))
self.end_headers()
self.wfile.write(body)
return

self.send_response(404)
self.end_headers()

def log_message(self, fmt, *args):
return

if __name__ == "__main__":
cert_file = os.environ.get("TLS_CERT_FILE")
key_file = os.environ.get("TLS_KEY_FILE")
port = int(os.environ.get("PORT", "8443"))
httpd = HTTPServer(("", port), Handler)
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain(certfile=cert_file, keyfile=key_file)
httpd.socket = context.wrap_socket(httpd.socket, server_side=True)
httpd.serve_forever()
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Name }}-eks-api
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: {{ .Name }}-eks-api
template:
metadata:
labels:
app: {{ .Name }}-eks-api
spec:
containers:
- name: api-server
image: python:3.13-alpine
imagePullPolicy: IfNotPresent
command:
- python3
- /scripts/server.py
env:
- name: TLS_CERT_FILE
value: /certs/tls.crt
- name: TLS_KEY_FILE
value: /certs/tls.key
- name: PORT
value: "8443"
ports:
- containerPort: 8443
name: https
volumeMounts:
- name: script
mountPath: /scripts
- name: certs
mountPath: /certs
volumes:
- name: script
configMap:
name: {{ .Name }}-eks-api-config
- name: certs
secret:
secretName: {{ .Name }}-eks-api-cert
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
apiVersion: v1
kind: Service
metadata:
name: {{ .Name }}-eks-api
namespace: default
spec:
selector:
app: {{ .Name }}-eks-api
ports:
- name: https
port: 8443
targetPort: https
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Name }}-fake-sa
namespace: default
data:
token: |
fake-service-account-token
namespace: |
default
ca.crt: |
-----BEGIN CERTIFICATE-----
MIIDDTCCAfWgAwIBAgIUHKur5/XvROOXy9Wd3R8HY8zCKr4wDQYJKoZIhvcNAQEL
BQAwFjEUMBIGA1UEAwwLZmFrZS1la3MtY2EwHhcNMjYwMTEzMTUyNDMxWhcNMzYw
MTExMTUyNDMxWjAWMRQwEgYDVQQDDAtmYWtlLWVrcy1jYTCCASIwDQYJKoZIhvcN
AQEBBQADggEPADCCAQoCggEBAI08VJ8dm6CG7dMzzLGESt9xWu9mmXh6oHT1Ajw1
QpuLLxl28IjUhAxvdGN7+/+Key3E5eIb4yHLELxrkd2AYQYUHC4F0+r1Hi2It5Fi
CB9+kzo1THQ0Uhwh7h239XWgm9J0SIh5Ew1YU23++1YBQser1HfUg8b92wKkr2KQ
AGHZtoTC2HAnhGyhoIF14v8+uGBjJA7FhprSVjtRKJ87JU92IqbcHhH1hZzI1eTS
LP5u5j6xfQIub86FOGMlWEDDqj+YBv0pqtXrzdJXzjwUiekyaHXmO+fL5I7Il5SX
WoIuAiGH7Ok3RUwriuKciBMzen8sJ+7/J4qskpB8B1ThyJUCAwEAAaNTMFEwHQYD
VR0OBBYEFIJq4GRDFkNgIxskxIKF5gY7EfhfMB8GA1UdIwQYMBaAFIJq4GRDFkNg
IxskxIKF5gY7EfhfMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB
AIW/TBnMsJfmQKl/SEIbfABJjbCiw8ctGKJ7qYcwS8C6zwi6cA//MV6293FmuCGY
yTdSWhtLF1Iik9kqnBdySIsFZxibBNu8JOggIQcAoSAwfPUbZvlZ1Bv6K8s3pv26
jojObrjmXyAPtrZXkseroPrIDsNAPe5U3V9ZISKQFk0Jz0ALRumioeXDz37B2D61
121dLqmRo931CJ8ycj9Ziy1gqWdSZbVvnWGo/115OwLQf5WIHTI0DdCyzK/n5bYs
iZCYuTOJqfj+boNa98InV4TYDlC3nYRnY4dl/PFW74Q3PsiWB5VbeLDJXVGyDp+Y
eoULusLKrB+wAJMMSr/4jEU=
-----END CERTIFICATE-----
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Name }}-config
namespace: default
data:
relay: |
exporters:
otlp:
endpoint: {{ .HostEndpoint }}:4317
tls:
insecure: true
extensions:
health_check:
endpoint: 0.0.0.0:13133
processors:
resourcedetection:
detectors: [eks]
timeout: 2s
override: false
eks:
node_from_env_var: K8S_NODE_NAME
resource_attributes:
cloud.account.id:
enabled: true
cloud.availability_zone:
enabled: true
cloud.region:
enabled: true
host.id:
enabled: true
host.name:
enabled: true
host.type:
enabled: true
host.image.id:
enabled: true
receivers:
hostmetrics:
collection_interval: 1s
scrapers:
cpu:
service:
telemetry:
logs:
level: "debug"
extensions:
- health_check
pipelines:
metrics:
receivers:
- hostmetrics
processors:
- resourcedetection
exporters:
- otlp
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ .Name }}-sa
namespace: default
automountServiceAccountToken: false
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
apiVersion: v1
kind: Service
metadata:
name: {{ .Name }}
namespace: default
spec:
selector:
app: {{ .Name }}
ports:
- name: otlp-grpc
port: 4317
targetPort: 4317
Loading