Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[DO NOT MERGE] Standalone Beats OTel collector PoC #41001

Closed
wants to merge 21 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
6dfd44b
[WIP] Beats to ES exporter OTel config
belimawr Sep 25, 2024
670c9f6
[WIP] parse more config options
belimawr Sep 25, 2024
9ed40c3
Extract TLS conversion to another function and package
belimawr Sep 25, 2024
cc9b664
Improve TLS handling and add host parsing
belimawr Sep 26, 2024
e72b7e6
Squashed commit of the following:
VihasMakwana Sep 26, 2024
188192b
Merge branch 'main' into beats-otel-collector
rdner Sep 26, 2024
88e1d69
fix typos: Otel -> OTel
AndersonQ Sep 26, 2024
52b1110
WIP: convert kafka output config to OTel kafka exporter config
AndersonQ Sep 26, 2024
c2131c3
adding config translation
khushijain21 Sep 26, 2024
6ef1733
WIP: extract topic and add codec
AndersonQ Sep 26, 2024
5d056df
elasticsearch.ToOTelConfig now returns a map[string]any
belimawr Sep 26, 2024
b6341d9
Format code and update NOTICE.txt
belimawr Sep 26, 2024
cd17757
Pass Beat config to elasticsearch.ToOTelConfig
belimawr Sep 26, 2024
5e60d79
kafka config converter: some test
AndersonQ Sep 26, 2024
d65f445
Merge remote-tracking branch 'upstream/beats-otel-collector' into bea…
AndersonQ Sep 26, 2024
3f0a0a2
chore: sample config
VihasMakwana Sep 26, 2024
20bac25
chore: add configurable option
VihasMakwana Sep 26, 2024
a7c1f9e
Merge branch 'beats-otel-collector' of github.com:elastic/beats into …
VihasMakwana Sep 26, 2024
d6670a1
Output translation returns map[string]any
belimawr Sep 26, 2024
216cf68
[WIP] Parse and use ES Beats config as OTel ES exporter
belimawr Sep 26, 2024
ff12e3e
Fix ES output transformation
belimawr Sep 27, 2024
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
34,538 changes: 24,452 additions & 10,086 deletions NOTICE.txt

Large diffs are not rendered by default.

186 changes: 135 additions & 51 deletions go.mod

Large diffs are not rendered by default.

397 changes: 291 additions & 106 deletions go.sum

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions libbeat/cmd/instance/beat.go
Original file line number Diff line number Diff line change
Expand Up @@ -360,6 +360,9 @@ func NewBeatReceiver(settings Settings, receiverConfig map[string]interface{}, c
logpConfig.Beat = b.Info.Name
logpConfig.Files.MaxSize = 1

if b.Config.Logging == nil {
b.Config.Logging = config.NewConfig()
}
if err := b.Config.Logging.Unpack(&logpConfig); err != nil {
return nil, fmt.Errorf("error unpacking beats logging config: %w\n%v", err, b.Config.Logging)
}
Expand Down
17 changes: 17 additions & 0 deletions libbeat/common/transport/kerberos/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
)

var (
InvalidAuthType = errors.New("invalid authentication type")

Check failure on line 36 in libbeat/common/transport/kerberos/config.go

View workflow job for this annotation

GitHub Actions / lint (windows)

ST1012: error var InvalidAuthType should have name of the form ErrFoo (stylecheck)

authTypes = map[string]AuthType{
authPasswordStr: authPassword,
Expand Down Expand Up @@ -70,6 +70,23 @@
return nil
}

func (t *AuthType) String() (string, error) {
if t == nil {
return "", InvalidAuthType
}

switch *t {
case authPassword:
return authPasswordStr, nil
case authKeytab:
return authPasswordStr, nil
default:

return "", fmt.Errorf("invalid authentication type '%d': %w",
*t, InvalidAuthType)
}
}

func (c *Config) Validate() error {
switch c.AuthType {
case authPassword:
Expand Down
119 changes: 119 additions & 0 deletions libbeat/outputs/elasticsearch/config_otel.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
// Licensed to Elasticsearch B.V. under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
// ownership. Elasticsearch B.V. licenses this file to you under
// the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.

package elasticsearch

import (
"fmt"

"go.opentelemetry.io/collector/config/configopaque"

"github.com/elastic/beats/v7/libbeat/cloudid"
"github.com/elastic/beats/v7/libbeat/common"
"github.com/elastic/beats/v7/libbeat/outputs"
"github.com/elastic/elastic-agent-libs/config"
)

// toOTelConfig converts a Beat config into an OTel elasticsearch exporter config
func ToOTelConfig(beatCfg *config.C) (map[string]any, error) {
// Handle cloud.id the same way Beats does, this will also handle
// extracting the Kibana URL (which is required to handle ILM on
// Beats side (currently not supported by ES OTel exporter).
if err := cloudid.OverwriteSettings(beatCfg); err != nil {
return nil, fmt.Errorf("cannot read cloudid: %w", err)
}

esRawCfg, err := beatCfg.Child("output.elasticsearch", -1)
if err != nil {
return nil, fmt.Errorf("could not parse Elasticsearch output configuration: %w", err)
}
escfg := defaultConfig
if err := esRawCfg.Unpack(&escfg); err != nil {
return nil, err
}

esToOTelOptions := struct {
Index string `config:"index"`
Pipeline string `config:"pipeline"`
ProxyURL string `config:"proxy_url"`
Hosts []string `config:"hosts" validate:"required"`
}{}

if err := esRawCfg.Unpack(&esToOTelOptions); err != nil {
return nil, fmt.Errorf("cannot parse Elasticsearch config: %w", err)
}

hosts := []string{}
for _, h := range esToOTelOptions.Hosts {
esURL, err := common.MakeURL(escfg.Protocol, escfg.Path, h, 9200)
if err != nil {
return nil, fmt.Errorf("cannot generate ES URL from host %q", err)

Check failure on line 64 in libbeat/outputs/elasticsearch/config_otel.go

View workflow job for this annotation

GitHub Actions / lint (windows)

non-wrapping format verb for fmt.Errorf. Use `%w` to format errors (errorlint)
}
hosts = append(hosts, esURL)
}

// The workers config is can be configured using two keys, so we leverage
// the already existing code to handle it by using `output.HostWorkerCfg`.
workersCfg := outputs.HostWorkerCfg{}
if err := esRawCfg.Unpack(&workersCfg); err != nil {
return nil, fmt.Errorf("cannot read worker/workers from Elasticsearch config: %w", err)
}

headers := make(map[string]configopaque.String, len(escfg.Headers))
for k, v := range escfg.Headers {
headers[k] = configopaque.String(v)
}

otelTLSConfg, err := outputs.TLSCommonToOTel(escfg.Transport.TLS)
if err != nil {
return nil, fmt.Errorf("cannot convert SSL config into OTel: %w", err)
}

otelYAMLCfg := map[string]any{
"logs_index": esToOTelOptions.Index, // index
"pipeline": esToOTelOptions.Pipeline, // pipeline
"endpoints": hosts, // hosts, protocol, path, port
"num_workers": workersCfg.NumWorkers(), // worker/workers

// Authentication
"user": escfg.Username, // username
"password": escfg.Password, // password
"api_key": escfg.APIKey, // api_key

// ClientConfig
"proxy_url": esToOTelOptions.ProxyURL, // proxy_url
"headers": headers, // headers
"timeout": escfg.Transport.Timeout, // timeout
"idle_conn_timeout": &escfg.Transport.IdleConnTimeout, // idle_connection_connection_timeout
"tls": otelTLSConfg, //TODO: convert it to map[string]any

// Retry
"retry": map[string]any{
"enabled": true,
"initial_interval": escfg.Backoff.Init, // backoff.init
"max_interval": escfg.Backoff.Max, // backoff.max
},

// Batcher
"batcher": map[string]any{
"enabled": true,
"max_size_items": escfg.BulkMaxSize, // bulk_max_size
},
}

return otelYAMLCfg, nil
}
129 changes: 129 additions & 0 deletions libbeat/outputs/elasticsearch/config_otel_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
// Licensed to Elasticsearch B.V. under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
// ownership. Elasticsearch B.V. licenses this file to you under
// the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.

package elasticsearch

import (
_ "embed"
"testing"

"github.com/elastic/elastic-agent-libs/config"
)

//go:embed testdata/filebeat.yml
var beatYAMLCfg string

//go:embed testdata/certs/client.crt
var clientCertPem string

Check failure on line 31 in libbeat/outputs/elasticsearch/config_otel_test.go

View workflow job for this annotation

GitHub Actions / lint (windows)

var `clientCertPem` is unused (unused)

//go:embed testdata/expectedCaPem.crt
var wantCAPem string

Check failure on line 34 in libbeat/outputs/elasticsearch/config_otel_test.go

View workflow job for this annotation

GitHub Actions / lint (windows)

var `wantCAPem` is unused (unused)

// Generating certs:
// Root CA: openssl req -x509 -ca -sha256 -days 1825 -newkey rsa:2048 -keyout rootCA.key -out rootCA.crt -passout pass:changeme
// Server Cert: openssl req -newkey rsa:2048 -keyout server.key -x509 -days 3650 -out server.crt -passout pass:changeme
// Client Cert: openssl req -newkey rsa:2048 -keyout client.key -x509 -days 3650 -out client.crt -passout pass:changeme -extensions usr_cert
func TestToOtelConfig(t *testing.T) {
beatCfg := config.MustNewConfigFrom(beatYAMLCfg)

otelCfg, err := ToOTelConfig(beatCfg)
if err != nil {
t.Fatalf("could not convert Beat config to OTel elasicsearch exporter: %s", err)
}

if got, want := len(otelCfg), 14; got != want {
t.Fatalf("expecting %d elements, got %d", want, got)
}

// if otelCfg.Endpoint != "" {
// t.Errorf("OTel endpoint must be emtpy got %s", otelCfg.Endpoint)

Check failure on line 53 in libbeat/outputs/elasticsearch/config_otel_test.go

View workflow job for this annotation

GitHub Actions / lint (windows)

`emtpy` is a misspelling of `empty` (misspell)
// }

// expectedHost := "https://es-hostname.elastic.co:443"
// if len(otelCfg.Endpoints) != 1 || otelCfg.Endpoints[0] != expectedHost {
// t.Errorf("OTel endpoints must contain only %q, got %q", expectedHost, otelCfg.Endpoints)
// }

// if got, want := otelCfg.Authentication.User, "elastic-cloud"; got != want {
// t.Errorf("expecting User %q, got %q", want, got)
// }

// if got, want := string(otelCfg.Authentication.Password), "password"; got != want {
// t.Errorf("expecting password to be '%s', got '%s' instead", want, got)
// }

// // // The ES config from Beats does not allow api_key and username/password to
// // // be set at the same time, so I'm keeping this assertion commented out
// // // for now
// // if got, want := string(otelCfg.Authentication.APIKey), "secret key"; got != want {
// // t.Errorf("expecting api_key to be '%s', got '%s' instead", want, got)
// // }

// if got, want := otelCfg.LogsIndex, "some-index"; got != want {
// t.Errorf("expecting logs index to be '%s', got '%s' instead", want, got)
// }

// if got, want := otelCfg.Pipeline, "some-ingest-pipeline"; got != want {
// t.Errorf("expecting pipeline to be '%s', got '%s' instead", want, got)
// }

// if got, want := otelCfg.ClientConfig.ProxyURL, "https://proxy.url"; got != want {
// t.Errorf("expecting proxy URL to be '%s', got '%s' instead", want, got)
// }

// if got, want := string(otelCfg.ClientConfig.TLSSetting.CertPem), clientCertPem; got != want {
// t.Errorf("expecting client certificate %q got %q", want, got)
// }

// gotCAPem := strings.TrimSpace(string(otelCfg.ClientConfig.TLSSetting.CAPem))
// wantCAPem = strings.TrimSpace(wantCAPem)
// if gotCAPem != wantCAPem {
// t.Errorf("expecting CA PEM:\n%s\ngot:\n%s", wantCAPem, gotCAPem)
// }

// if !*otelCfg.Batcher.Enabled {
// t.Error("expecting batcher.enabled to be true")
// }

// if got, want := otelCfg.Batcher.MaxSizeItems, 42; got != want {
// t.Errorf("expecting batcher.max_size_items = %d got %d", want, got)
// }

// if !otelCfg.Retry.Enabled {
// t.Error("expecting retyr.enabled to be true")
// }

// if got, want := otelCfg.Retry.InitialInterval, time.Second*42; got != want {
// t.Errorf("expecting retry.initial_interval '%s', got '%s'", got, want)
// }

// if got, want := otelCfg.NumWorkers, 30; got != want {
// t.Errorf("expecting num_workers %d got %d", want, got)
// }

// headers := map[string]string{
// "X-Header-1": "foo",
// "X-Bar-Header": "bar",
// }

// for k, v := range headers {
// gotV := string(otelCfg.Headers[k])
// if gotV != v {
// t.Errorf("expecting header[%s]='%s', got '%s", k, v, gotV)
// }
// }
}
23 changes: 23 additions & 0 deletions libbeat/outputs/elasticsearch/testdata/certs/client.crt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
-----BEGIN CERTIFICATE-----
MIID2jCCAsKgAwIBAgIUXSGhi1rVH7ftDmJ6TlavLsY/74MwDQYJKoZIhvcNAQEL
BQAwgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIDAdGbG9yaWRhMRAwDgYDVQQHDAdP
cmxhbmRvMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxFzAVBgNV
BAMMDkVsYXN0aWMgQ2xpZW50MSAwHgYJKoZIhvcNAQkBFhFjbGllbnRAZWxhc3Rp
Yy5jbzAeFw0yNDA5MjUxOTAzNDZaFw0zNDA5MjMxOTAzNDZaMIGPMQswCQYDVQQG
EwJVUzEQMA4GA1UECAwHRmxvcmlkYTEQMA4GA1UEBwwHT3JsYW5kbzEhMB8GA1UE
CgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRcwFQYDVQQDDA5FbGFzdGljIENs
aWVudDEgMB4GCSqGSIb3DQEJARYRY2xpZW50QGVsYXN0aWMuY28wggEiMA0GCSqG
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAVGPlx4U2BpWfQlyMNraLMjdJAo4PjO2G
rDbwg2cAO4QFbMECEiNHakvuJ3zVVDO+HsBdkLWr8nO4iXmZDokfDrOrANJuqq16
p022soC8pJQz9uIBWTnxDGd/wdofi4H+V5uaMhw961sgB7GREyBWNRBQzhcFyQEP
XkR1/G52PcuzM5H9cnOSy7jc62g8Pkk8c2eZu3ADmvgWSH0b5pFUIvKsq068QjKP
qoHYXn38d/SSeCX57tzKsj+mBzp0cr1f9jeXmKeu68wPYG14aj9WmmY6ICAPvqPF
BKNLhXn2xPlZzv93zjiUR5bnitenVxvsmwjn5XvlgH56/fh3Y3aPAgMBAAGjLDAq
MAkGA1UdEwQCMAAwHQYDVR0OBBYEFJlsmqi3qid9YoWj4N7GQvAywRzbMA0GCSqG
SIb3DQEBCwUAA4IBAQCAtBwyiRYAGeAcN/UuMEcnMXP8QNrnCO/unoCbyFsByFQT
TcwMrS441hGPp/cAa8Fx0cP+oqrO99G1YHCzhprYVqIi/W9MsvRnR7Nh8SSS2/ld
0Gv9g+DU89NMzE5hlMCt5V0ydKbRj+ChKDsKlgQSopbrArjxHQv4Hb234HSZAR5N
OkJ1rNCF7wMD+xlNzEWZAHl7qjHuG8C4xWP207dXGYuY3064rBqv9hypLxj7RuZn
qesVBabxXBCL6Y1foh5OLLHyEWw28yfK/PnVdqU0lLrBhW9VJ6mQ9XCwZxf/tlSk
B3FafTQk4ZtU+4bVJuiAiQI7DeqpIFU6Lczds2gG
-----END CERTIFICATE-----
30 changes: 30 additions & 0 deletions libbeat/outputs/elasticsearch/testdata/certs/client.key
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFJDBWBgkqhkiG9w0BBQ0wSTAxBgkqhkiG9w0BBQwwJAQQIvmnc5UnulJR02Cu
F8Tu3AICCAAwDAYIKoZIhvcNAgkFADAUBggqhkiG9w0DBwQIfWoE0u+cD2UEggTI
nIkL4C23EV0lcnfuJcC/QpIvgiIG34mPhK5miPLjHTlcDvYG3tZLbTSUCKXiTyJX
sHF+Om0RoT1gEtbSVPknXYNBQs0CWMUlOrmql1wxwCAS1HZelVjBbg+QJYQd6Jxa
RHeVtAuEe19cFYtL9u1G3LFXESclUgtiAS/X1Y9648KcDgMa0yTqXwmNd5f2c4eU
r+cqfWvZ1KZhNzNYbS+ycnCsHAg8PcEV864P/+xhkircb/EfadzPnpYD0fYdONMC
OEw5J2dmfmUDVVR+8fdeEkE9qhTe25inymJ1Yg0ScwdyrJ8/5gb5bCfR/py1++cy
WtZAT4dBQySS3SjEYjm5ZWwOx6sxjtzmM4g06gzGozbh+g9GONSMTaGccLJm3jsn
B6Ter91GkSY2Hsrl6fSe7FQ+KTSE0hy18OUI+x6E/JfuGer21Q7YYUk+C0Sx3mKd
MQ22nyErJtdTkWqVyTxwT61lq98X3g5Vcy3WMLPiC4ntSQuMaEJWY1sGQIhS6R5x
gpO5hqPJKY6VyDecU+Dem8/0+Juh+a1nDO7kDtx9MMZvRqfvmNiB68x0MNkHB3Vx
hLyyqlPAnrx50+sAgK50sADfuCdI+A/bIIFBE0Pxk24pfhSB5WsBK5q+Cq4TuOlh
KRXpnksZXkH8zwcJf+5OWodnycWbHQzzONBEn0KgHCPY1MQeFwLNa9mPpXhWf6yR
pa6g6hCo+zHA0WgjfNfzPY20gxh6M/zG9lklxS90Oki9WGf4zkrhITqST5+dwokD
UVhYCt9furyKfxWRt6iuIjN7mFoFpM8nakQigIJ5rHMqdkgDxEyCvaAnk5ruTFCS
SRF0KALcXEff46b2+k9fthDZulNJzInK35CgD14kMEI6mnzQPsvu9oQMGpaO8he0
hRMWhGuDY+peedhhLR/lEVFUK3HI5yMwPJ3oMU6vDaiJ4bJqFV/C3FOP84BmZDdf
Cybsaq6WPUjUfx8DxEi5K58XlWzgBmg90RvfsP4WeMKhXZG74IMoT/nCGFPnDKSR
7UQ7ay2lnYqMdma1BMwgaxUuEZT0e87cApPsD3xDbrswBYo/I8l1T6al21K//xsu
C9Do3bMC9a+M38dkWxI7wngyMoZKj6g8IGGIljhKx9A9UodGmbZzZm6Z8AldWaVj
DTDobFmBDrMUq91y0jC1eZ7lzwKtSqr8RF8E6tk1U1uiFZ631JMtv+MqvLjl4Z2E
Z81GRwKQMhIJZehVNE4wsFEeBu+sPj6NwUKamR9Bzvlir7lqwwFE0RxnOmPcmsLJ
yPESe//vRild5PPOabadAu3xWnL1GqTt6VDbtQ5F7H5St59w4ByK3GO/CpmLa5nf
RirZR1eMdtXy6AuLFoncsLeJAzqEVG3Sc2owC4+kh4i7Z974nkmVG2XuOr80TZ7o
nbwvxG0Ay26o5IUL70wOTaDKYxAyd0lvrjFB9kFtI+ws6XRtXNrvN5KB3WcNaEb1
P4PTlfdQKQL+Eq8uOG6jBta57Xh3UFmHPKV73suZMRFVKWnqWyR7vfYfAAFG2yfH
pGE5ATMFoxD+tDVZwbYBjSiZj/aKkuYiHHourrsVtY6ozFEGmlY0BpjkJgOn1EnE
S4Lm6iYDHHjM1Jj5f0yktyZ9tUhuCpVI
-----END ENCRYPTED PRIVATE KEY-----
23 changes: 23 additions & 0 deletions libbeat/outputs/elasticsearch/testdata/certs/rootCA.crt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
-----BEGIN CERTIFICATE-----
MIIDzTCCArWgAwIBAgIURzQp9/bWT37HJX71yfGEO0xrs2wwDQYJKoZIhvcNAQEL
BQAwdjELMAkGA1UEBhMCVVMxDzANBgNVBAgMBkFsYXNrYTETMBEGA1UEBwwKR2xl
bm5hbGxlbjEQMA4GA1UECgwHRWxhc3RpYzEQMA4GA1UEAwwHRWxhc3RpYzEdMBsG
CSqGSIb3DQEJARYOZm9vQGVsYXN0aWMuY28wHhcNMjQwOTI1MTg1NDQ0WhcNMjkw
OTI0MTg1NDQ0WjB2MQswCQYDVQQGEwJVUzEPMA0GA1UECAwGQWxhc2thMRMwEQYD
VQQHDApHbGVubmFsbGVuMRAwDgYDVQQKDAdFbGFzdGljMRAwDgYDVQQDDAdFbGFz
dGljMR0wGwYJKoZIhvcNAQkBFg5mb29AZWxhc3RpYy5jbzCCASIwDQYJKoZIhvcN
AQEBBQADggEPADCCAQoCggEBAM4FpucFZ9WGZ1uysSYEclFII49BNw6kTAc8H79S
rZBbKCxOz2SoDof0ZAGzcactMFOHT2EuimWoO3crQMfP1RDbWNMt03LauK/zqcUv
8dwPhflbHIMS67Vse5b2wpnKclcfh5bIgCl2QADcdJcGTaQ+7a3akokRPe0GFdo1
r/JgdPoZ026A7Icve+PB7hbOn4NA9IWOp3GZGfPMC3t6MOZsFPDn7HU2YiKVK6rz
h+Z1yhpBzqP/C0/mXg68GZNzlEOuBfEvAVFuXIzAZ8ePZz+NJOmpZEdrUVTTiYWX
L25RHOqLcf1lD1MAN+WCOW27gPSAxSGLjf1r/75kOpF9RxECAwEAAaNTMFEwHQYD
VR0OBBYEFPF9yKBFHPCdOlQYjuCQl55grgxQMB8GA1UdIwQYMBaAFPF9yKBFHPCd
OlQYjuCQl55grgxQMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB
AFAUX7H/NCNh9EyxQTneNQFOnxFBiwtaluneu0QLMhnIrRXN3RVowJ3+GI+nkRAl
48y8UeBm1urKGCpAygEblzzin5FB8TdtP7Cl4sQ98HVUbAcBJt93HR39SWTJzQIq
qkVEFLrYe9NfYEoFr9LxY2bkb1Ga7BB0guRm/Tyw4NdDbNk+nzMYbYUSUE124IFh
KPQA/X2ZeRIrZJwFhTMdMy+JkkkZGThB4lXLWaLAX8CIcERtGy2CwugAFdT7PHGr
2DQY+NmOje59N9BPezJDY9OvbuZz8NPRRzB3Iv3jDCDD/eCVgrGtG6Y9tTdYztFQ
CkBAlZultTt5DPEE+4400mU=
-----END CERTIFICATE-----
30 changes: 30 additions & 0 deletions libbeat/outputs/elasticsearch/testdata/certs/rootCA.key
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFJDBWBgkqhkiG9w0BBQ0wSTAxBgkqhkiG9w0BBQwwJAQQhTmxl2OEjM7SPmV3
63zBAQICCAAwDAYIKoZIhvcNAgkFADAUBggqhkiG9w0DBwQI8yT0pNlFBh4EggTI
/MHVNTAScoGKke4T/Z8jyVx0ytiFdWBNSnMVV+xb+2/M/2TDp5Fx6617ANJLdIdQ
3r5F3apz7+M+OTcbXO2vdD1Zj7h/q3DhnyiSf9mKO/yCJ1LaCggJe+tmHCyOMFde
VknXeE3Bas4ne1hdP2wOMfXAACESoQYBERRFIMIs4I4JWTBpKGocVjv4SiYjDonh
jsgOkzwJvcYrSkEE8My2+EZhCnDzJLkLAGphmxIxnWMEPpcHDGwiaMpYq5vkyY75
xs3fYlCmvfqQaAFgUQW8RsIX569z0s/1qq6fTQLDkAk2a27jZ28oTbr1NNmHbrd0
YffBBoiqn17+Zh3K5BogXBRxBAN2VIT6cbqAkeN5F7yqN08xsWasrR0UluuIoHNZ
T3FQ28JnWib2tTOmYnlq/ppV/GJVIfTEHY4bFONyqdkV1winkHcHqRG/8NR/X3RW
W426BzrmwHo5vdwbn9QG6GXvBH5L/Sj2XALlLZMvzOr86YGYkjWq2Z43r/LTtVy+
2hNcYLQMstS2D169Sw5zCFV83z1bYVqHhTrBbyLOv0tL4USApH+3vDPbZyfnoh4v
gBhqGxpMgqgApZbEA0XoqQ06g9MoZX+6m4S0ihEKU+YUCuopTylPRjZpLIMe3mcF
Lh5faQTttjK2cySUt/LfgyB6LbDCuBBe87Zf7GXVUy8G1YQ9x1UK5g7dYuvz3us4
pzd7q9wYjCdUl5pvPdS6VsjImItR0ciKg7cQ7xSRReg2Bb0bk0BTBwocSHM2NC0d
ecEBXk4fS3lvMSKUp6ubvekSZpRMKFPMicRbc7CISB6cq7H9hrcwfXuGx2kOgxDH
lM5unGOE3WwtWrJq083SirjETr3UDhWns3G3WjmSk/JSJ4fhliSsOg+adRRrrVwc
xc0vZvqjZlm+OKZXsHrwybSu4ng9rgw2CWz/IWm7szPqZz3f+qimfHhUJfx8E7Or
rGDG07SXt2tA3jBdo761+W9MWkHmW5wrhRTUkGGWaqAnzst3WHuRVmIC3CCI2ySa
zujoI5oG6A+xDew2toGhEBt6mQ5SG13qn2A+2E0rBDK05EGEXo2SpLoshTg4c8ke
Qfpcudj0AXmv2fvDP1cMh3sybQ6LDwxdHrHDFDJ9lJLfC0EBPs8HNdhPPP5vI/I4
BgosnbHLQzPpdSPvdgTxEeq0TUKXt4Q3oNdroJ0Gd6yOg7o0buhtPfBsE0oei6Qe
NhHp03tUqIbcdTcwnnlQZGpllE1hTp0cx1lz7Q2rIFoneaR4RqvuSxAgnX+/Qmnl
fUeHnmaLr8yQiXPEefGLvAINFlQomLD9cuh1KopdZE/Dc1+y0PWgJnmLNAT02FwW
ttG0jMeZ/lMpJNXLBF3DvfpPKFAxZnEbGxgZu0nwyZJYT733sK1UCyAeKC1qXqsG
/ELjx7QLF+TIXgbd1V5W5HBDjtl8wH85wkYDqfiW2wWP9wf4oRe3YptMZSQQ7zdN
FP84gF/nNHsiRwc/a1XfKr72dQJA0PSUTEkst8lBaFvLdBAwc5Xgqi9yB8hGOxeb
vFL/eZxds0I/GZ7ntkDNEQK9d8yMaiYBneGCd851LkbWg1HjNvh/XaG53QyF0j1o
Hp2OYvo+h0G/dzaA9wlOJ7gp5HqWcZL8
-----END ENCRYPTED PRIVATE KEY-----
Loading
Loading