github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/integration/integration_influx_test.go (about) 1 //go:build integration 2 // +build integration 3 4 // can be executed with 5 // go test -v -tags integration -run TestInfluxIntegration ./integration/... 6 7 package main 8 9 import ( 10 "context" 11 "fmt" 12 "testing" 13 14 "github.com/SAP/jenkins-library/pkg/influx" 15 influxdb2 "github.com/influxdata/influxdb-client-go/v2" 16 "github.com/stretchr/testify/assert" 17 "github.com/testcontainers/testcontainers-go" 18 "github.com/testcontainers/testcontainers-go/wait" 19 ) 20 21 func TestInfluxIntegrationWriteMetrics(t *testing.T) { 22 t.Parallel() 23 ctx := context.Background() 24 const authToken = "influx-token" 25 const username = "username" 26 const password = "password" 27 const bucket = "piper" 28 const organization = "org" 29 30 req := testcontainers.GenericContainerRequest{ 31 ContainerRequest: testcontainers.ContainerRequest{ 32 AlwaysPullImage: true, 33 Image: "influxdb:2.0", 34 ExposedPorts: []string{"8086/tcp"}, 35 Env: map[string]string{ 36 "DOCKER_INFLUXDB_INIT_MODE": "setup", 37 "DOCKER_INFLUXDB_INIT_USERNAME": username, 38 "DOCKER_INFLUXDB_INIT_PASSWORD": password, 39 "DOCKER_INFLUXDB_INIT_ORG": organization, 40 "DOCKER_INFLUXDB_INIT_BUCKET": bucket, 41 "DOCKER_INFLUXDB_INIT_ADMIN_TOKEN": authToken, 42 }, 43 WaitingFor: wait.ForListeningPort("8086/tcp"), 44 }, 45 Started: true, 46 } 47 48 influxContainer, err := testcontainers.GenericContainer(ctx, req) 49 assert.NoError(t, err) 50 defer influxContainer.Terminate(ctx) 51 52 ip, err := influxContainer.Host(ctx) 53 assert.NoError(t, err) 54 port, err := influxContainer.MappedPort(ctx, "8086") 55 host := fmt.Sprintf("http://%s:%s", ip, port.Port()) 56 dataMap := map[string]map[string]interface{}{ 57 "series_1": {"field_a": 11, "field_b": 12}, 58 "series_2": {"field_c": 21, "field_d": 22}, 59 } 60 dataMapTags := map[string]map[string]string{ 61 "series_1": {"tag_a": "a", "tag_b": "b"}, 62 "series_2": {"tag_c": "c", "tag_d": "d"}, 63 } 64 influxClient := influxdb2.NewClient(host, authToken) 65 defer influxClient.Close() 66 client := influx.NewClient(influxClient, organization, bucket) 67 err = client.WriteMetrics(dataMap, dataMapTags) 68 assert.NoError(t, err) 69 70 queryAPI := influxClient.QueryAPI(organization) 71 result, err := queryAPI.Query(context.Background(), 72 `from(bucket:"piper")|> range(start: -1h) |> filter(fn: (r) => r._measurement == "series_1" or r._measurement == "series_2")`) 73 assert.NoError(t, err) 74 valuesMap := map[string]map[string]interface{}{} 75 expectedValuesMap := map[string]map[string]interface{}{ 76 "series_1_field_a": {"_field": "field_a", "_measurement": "series_1", "_value": int64(11), "tag_a": "a", "tag_b": "b"}, 77 "series_1_field_b": {"_field": "field_b", "_measurement": "series_1", "_value": int64(12), "tag_a": "a", "tag_b": "b"}, 78 "series_2_field_c": {"_field": "field_c", "_measurement": "series_2", "_value": int64(21), "tag_c": "c", "tag_d": "d"}, 79 "series_2_field_d": {"_field": "field_d", "_measurement": "series_2", "_value": int64(22), "tag_c": "c", "tag_d": "d"}, 80 } 81 for result.Next() { 82 values := result.Record().Values() 83 measurement := values["_measurement"] 84 field := values["_field"] 85 delete(values, "_start") 86 delete(values, "_stop") 87 delete(values, "_time") 88 delete(values, "result") 89 delete(values, "table") 90 valuesMap[fmt.Sprintf("%v_%v", measurement, field)] = values 91 } 92 assert.NoError(t, result.Err()) 93 assert.Equal(t, len(expectedValuesMap), len(valuesMap)) 94 assert.Equal(t, expectedValuesMap, valuesMap) 95 }