mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-11-23 20:37:12 +01:00
e0930687f1
This commit adds the following changes: - Added support to push datadog logs with examples of how to ingest data using Vector and Fluentbit - Updated VictoriaLogs examples directory structure to have single container image for victorialogs, agent (fluentbit, vector, etc) but multiple configurations for different protocols Related issue https://github.com/VictoriaMetrics/VictoriaMetrics/issues/6632
118 lines
3.2 KiB
Go
118 lines
3.2 KiB
Go
package datadog
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/logstorage"
|
|
)
|
|
|
|
func TestReadLogsRequestFailure(t *testing.T) {
|
|
f := func(data string) {
|
|
t.Helper()
|
|
|
|
ts := time.Now().UnixNano()
|
|
|
|
processLogMessage := func(timestamp int64, fields []logstorage.Field) {
|
|
t.Fatalf("unexpected call to processLogMessage with timestamp=%d, fields=%s", timestamp, fields)
|
|
}
|
|
|
|
rows, err := readLogsRequest(ts, []byte(data), processLogMessage)
|
|
if err == nil {
|
|
t.Fatalf("expecting non-empty error")
|
|
}
|
|
if rows != 0 {
|
|
t.Fatalf("unexpected non-zero rows=%d", rows)
|
|
}
|
|
}
|
|
f("foobar")
|
|
f(`{}`)
|
|
f(`["create":{}]`)
|
|
f(`{"create":{}}
|
|
foobar`)
|
|
}
|
|
|
|
func TestReadLogsRequestSuccess(t *testing.T) {
|
|
f := func(data string, rowsExpected int, resultExpected string) {
|
|
t.Helper()
|
|
|
|
ts := time.Now().UnixNano()
|
|
var result string
|
|
processLogMessage := func(_ int64, fields []logstorage.Field) {
|
|
a := make([]string, len(fields))
|
|
for i, f := range fields {
|
|
a[i] = fmt.Sprintf("%q:%q", f.Name, f.Value)
|
|
}
|
|
if len(result) > 0 {
|
|
result = result + "\n"
|
|
}
|
|
s := "{" + strings.Join(a, ",") + "}"
|
|
result += s
|
|
}
|
|
|
|
// Read the request without compression
|
|
rows, err := readLogsRequest(ts, []byte(data), processLogMessage)
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %s", err)
|
|
}
|
|
if rows != rowsExpected {
|
|
t.Fatalf("unexpected rows read; got %d; want %d", rows, rowsExpected)
|
|
}
|
|
|
|
if result != resultExpected {
|
|
t.Fatalf("unexpected result;\ngot\n%s\nwant\n%s", result, resultExpected)
|
|
}
|
|
}
|
|
|
|
// Verify non-empty data
|
|
data := `[
|
|
{
|
|
"ddsource":"nginx",
|
|
"ddtags":"tag1:value1,tag2:value2",
|
|
"hostname":"127.0.0.1",
|
|
"message":"bar",
|
|
"service":"test"
|
|
}, {
|
|
"ddsource":"nginx",
|
|
"ddtags":"tag1:value1,tag2:value2",
|
|
"hostname":"127.0.0.1",
|
|
"message":"foobar",
|
|
"service":"test"
|
|
}, {
|
|
"ddsource":"nginx",
|
|
"ddtags":"tag1:value1,tag2:value2",
|
|
"hostname":"127.0.0.1",
|
|
"message":"baz",
|
|
"service":"test"
|
|
}, {
|
|
"ddsource":"nginx",
|
|
"ddtags":"tag1:value1,tag2:value2",
|
|
"hostname":"127.0.0.1",
|
|
"message":"xyz",
|
|
"service":"test"
|
|
}, {
|
|
"ddsource": "nginx",
|
|
"ddtags":"tag1:value1,tag2:value2,",
|
|
"hostname":"127.0.0.1",
|
|
"message":"xyz",
|
|
"service":"test"
|
|
}, {
|
|
"ddsource":"nginx",
|
|
"ddtags":",tag1:value1,tag2:value2",
|
|
"hostname":"127.0.0.1",
|
|
"message":"xyz",
|
|
"service":"test"
|
|
}
|
|
]`
|
|
rowsExpected := 6
|
|
resultExpected := `{"ddsource":"nginx","tag1":"value1","tag2":"value2","hostname":"127.0.0.1","_msg":"bar","service":"test"}
|
|
{"ddsource":"nginx","tag1":"value1","tag2":"value2","hostname":"127.0.0.1","_msg":"foobar","service":"test"}
|
|
{"ddsource":"nginx","tag1":"value1","tag2":"value2","hostname":"127.0.0.1","_msg":"baz","service":"test"}
|
|
{"ddsource":"nginx","tag1":"value1","tag2":"value2","hostname":"127.0.0.1","_msg":"xyz","service":"test"}
|
|
{"ddsource":"nginx","tag1":"value1","tag2":"value2","hostname":"127.0.0.1","_msg":"xyz","service":"test"}
|
|
{"ddsource":"nginx","tag1":"value1","tag2":"value2","hostname":"127.0.0.1","_msg":"xyz","service":"test"}`
|
|
f(data, rowsExpected, resultExpected)
|
|
}
|