feat(outputs.elasticsearch): Support data streams (#15613)

This commit is contained in:
cnemo-cenic 2024-07-09 12:09:02 -07:00 committed by GitHub
parent e697076c2b
commit a8355c74b9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 60 additions and 0 deletions

View File

@ -286,6 +286,10 @@ to use them.
# default_tag_value = "none" # default_tag_value = "none"
index_name = "telegraf-%Y.%m.%d" # required. index_name = "telegraf-%Y.%m.%d" # required.
## Optional Index Config
## Set to true if Telegraf should use the "create" OpType while indexing
# use_optype_create = false
## Optional TLS Config ## Optional TLS Config
# tls_ca = "/etc/telegraf/ca.pem" # tls_ca = "/etc/telegraf/ca.pem"
# tls_cert = "/etc/telegraf/cert.pem" # tls_cert = "/etc/telegraf/cert.pem"
@ -397,6 +401,9 @@ the `default_tag_value` will be used instead.
`inf`s if `float_handling` is set to `replace`. Negative `inf` will be `inf`s if `float_handling` is set to `replace`. Negative `inf` will be
replaced by the negative value in this number to respect the sign of the replaced by the negative value in this number to respect the sign of the
field's original value. field's original value.
* `use_optype_create`: If set, the "create" operation type will be used when
indexing into Elasticsearch, which is needed when using the Elasticsearch
data streams feature.
* `use_pipeline`: If set, the set value will be used as the pipeline to call * `use_pipeline`: If set, the set value will be used as the pipeline to call
when sending events to elasticsearch. Additionally, you can specify dynamic when sending events to elasticsearch. Additionally, you can specify dynamic
pipeline names by using tags with the notation ```{{tag_name}}```. If the tag pipeline names by using tags with the notation ```{{tag_name}}```. If the tag

View File

@ -43,6 +43,7 @@ type Elasticsearch struct {
IndexTemplate map[string]interface{} `toml:"template_index_settings"` IndexTemplate map[string]interface{} `toml:"template_index_settings"`
ManageTemplate bool `toml:"manage_template"` ManageTemplate bool `toml:"manage_template"`
OverwriteTemplate bool `toml:"overwrite_template"` OverwriteTemplate bool `toml:"overwrite_template"`
UseOpTypeCreate bool `toml:"use_optype_create"`
Username config.Secret `toml:"username"` Username config.Secret `toml:"username"`
Password config.Secret `toml:"password"` Password config.Secret `toml:"password"`
TemplateName string `toml:"template_name"` TemplateName string `toml:"template_name"`
@ -304,6 +305,10 @@ func (a *Elasticsearch) Write(metrics []telegraf.Metric) error {
br := elastic.NewBulkIndexRequest().Index(indexName).Doc(m) br := elastic.NewBulkIndexRequest().Index(indexName).Doc(m)
if a.UseOpTypeCreate {
br.OpType("create")
}
if a.ForceDocumentID { if a.ForceDocumentID {
id := GetPointID(metric) id := GetPointID(metric)
br.Id(id) br.Id(id)

View File

@ -298,6 +298,50 @@ func TestTemplateManagementEmptyTemplateIntegration(t *testing.T) {
require.Error(t, err) require.Error(t, err)
} }
func TestUseOpTypeCreate(t *testing.T) {
if testing.Short() {
t.Skip("Skipping integration test in short mode")
}
container := launchTestContainer(t)
defer container.Terminate()
urls := []string{
fmt.Sprintf("http://%s:%s", container.Address, container.Ports[servicePort]),
}
e := &Elasticsearch{
URLs: urls,
IndexName: "test-%Y.%m.%d",
Timeout: config.Duration(time.Second * 5),
EnableGzip: true,
ManageTemplate: true,
TemplateName: "telegraf",
OverwriteTemplate: true,
UseOpTypeCreate: true,
Log: testutil.Logger{},
}
ctx, cancel := context.WithTimeout(context.Background(), time.Duration(e.Timeout))
defer cancel()
metrics := []telegraf.Metric{
testutil.TestMetric(1),
}
err := e.Connect()
require.NoError(t, err)
err = e.manageTemplate(ctx)
require.NoError(t, err)
// Verify that we can fail for metric with unhandled NaN/inf/-inf values
for _, m := range metrics {
err = e.Write([]telegraf.Metric{m})
require.NoError(t, err)
}
}
func TestTemplateManagementIntegration(t *testing.T) { func TestTemplateManagementIntegration(t *testing.T) {
if testing.Short() { if testing.Short() {
t.Skip("Skipping integration test in short mode") t.Skip("Skipping integration test in short mode")

View File

@ -40,6 +40,10 @@
# default_tag_value = "none" # default_tag_value = "none"
index_name = "telegraf-%Y.%m.%d" # required. index_name = "telegraf-%Y.%m.%d" # required.
## Optional Index Config
## Set to true if Telegraf should use the "create" OpType while indexing
# use_optype_create = false
## Optional TLS Config ## Optional TLS Config
# tls_ca = "/etc/telegraf/ca.pem" # tls_ca = "/etc/telegraf/ca.pem"
# tls_cert = "/etc/telegraf/cert.pem" # tls_cert = "/etc/telegraf/cert.pem"