Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
5835d34
initial checkin of slzebriumexporter
Mar 22, 2023
3317814
stage 1 of refactor of slzebriumexporter to work with sllogformatproc…
Mar 22, 2023
12f1546
skeleton of rework for slzebriumexporter
Mar 22, 2023
c5d7b5a
fisrt cut of refactor slzebriumexporter complete
Mar 22, 2023
f9252cc
checkin of slzebriumexporter/examples/otelcol_windows.yaml
watercraft Mar 22, 2023
6cc1110
sanitize slzebriumexporter/examples/otelcol_windows.yaml
watercraft Mar 22, 2023
f1b7102
update slzebriumexporter/README.md
Mar 23, 2023
56acc91
try tmpost zapi endpoint
Mar 28, 2023
78834bf
pass sl_format from sllogformatprocessor to slzebriumexporter in orde…
Apr 4, 2023
a8064a3
pass sl_format from sllogformatprocessor to slzebriumexporter in orde…
Apr 4, 2023
2417b1e
Fix null pointer reference if metadata is missing
robf17 Apr 21, 2023
2fbd202
fix null pointer dereference in validating presence of sl_metadata
Apr 29, 2023
a6f70a0
slzebrium - fix null pointer dereference in validating presence of sl…
Apr 29, 2023
fd7a1f5
Merge branch 'master' into master-rob
robf17 May 3, 2023
62dba30
sllogformat - convert to dot notation part 1
May 15, 2023
a4ccac3
sllogformat - convert to dot notation part 2
May 15, 2023
e696a6a
sllogformat - attribute replace function
May 15, 2023
d8f4398
sllogformat - implement operators || and +
May 16, 2023
552dbdb
update all examples of sllogformat config to new attribute syntax
May 16, 2023
846a384
ZS-3545 - sllogformatprocessor add config for rmtail, http_status and…
Jun 8, 2023
c2cafa4
ZS-3545 - sllogformatprocessor add config for rmtail, http_status and…
Jun 8, 2023
ac9484f
Initial onboarding of CICD pipeline.
b3arpsl Jun 13, 2023
273c990
Initial onboarding of CICD pipeline.
b3arpsl Jun 13, 2023
38d5343
Merge remote-tracking branch 'origin/feature/ET-1206' into feature/ET…
b3arpsl Jun 13, 2023
61dce8b
ZS-3755 stub out tests for sllogformatprocessor and slzebriumexporter
Jun 22, 2023
196f093
ZS-3755 slzebriumexporter - valid unit test cases
Jun 23, 2023
e20d7bb
Push of initial otel automation pipeline
b3arpsl Jun 28, 2023
30727db
ZS-3755 stub out tests for sllogformatprocessor and slzebriumexporter
Jun 22, 2023
d3b2dcd
ZS-3755 slzebriumexporter - valid unit test cases
Jun 23, 2023
26b3614
Merged master into feature/ET-1206
b3arpsl Jun 29, 2023
c6032fb
sllogformatprocessor, slzebriumexporter - remove metric & trace testdata
Jul 2, 2023
126a102
sllogformat / slsebrium - example k8s config map deployment with logs…
Jul 7, 2023
57f076b
slzebriumexporter - update image id in examples/otelcol_k8s_configmap…
Jul 7, 2023
313fc89
ZS-3847 logformat - update slzebriumexporter/examples/otelcol_docker.…
Jul 27, 2023
44b24cd
ZS-3847 sllogformat - update otelcol_windows.yaml for new nested conf…
watercraft Jul 28, 2023
a1db12f
ZS-3847 slzebrium - rework otelcol_cloudwatch.yaml around new nested …
watercraft Aug 2, 2023
b7ef346
ZS-3847 slzebrium - rework otelcol_azure.yaml around new nested sllog…
watercraft Aug 2, 2023
2ccf109
ZS-3847 slzebrium - rework otelcol_k8s_configmap.yaml for nested sllo…
watercraft Aug 3, 2023
fb407f7
ZS-3847 sllogformat, slzebrium - reword README.md files for nested co…
watercraft Aug 3, 2023
f5d6eff
Pushing windows zip installation.
b3arpsl Aug 8, 2023
ca9befc
Merge branch 'main' into zs-3847-regexp
watercraft Aug 23, 2023
7c8ee9c
update slabexporter/examples/otelcol_k8s_ab.yaml for new sllogformat …
watercraft Aug 23, 2023
f36b81c
update slzebrium README.md example to parse ze_token as a string
watercraft Aug 23, 2023
54c4679
ZS-3847 use Xs instead of zero for ze_token in slzebrium exmaple configs
watercraft Aug 24, 2023
b16a395
ZS-3847 use Xs instead of zero for ze_token in slzebrium exmaple conf…
watercraft Aug 24, 2023
dd60f9f
Bump go.uber.org/zap from 1.24.0 to 1.26.0 in /slzebriumexporter
Sep 18, 2023
6d063b2
Bump golang.org/x/net from 0.7.0 to 0.17.0 in /slzebriumexporter
Oct 11, 2023
332d1e2
Bump google.golang.org/grpc from 1.51.0 to 1.56.3 in /slzebriumexporter
Dec 18, 2023
e8d3e9e
Bump go.opentelemetry.io/collector/consumer in /slzebriumexporter
Dec 18, 2023
f031ce9
Update-upstream-otel-to-v0.91.0
watercraft Dec 19, 2023
bf3e712
Fixed gomod issues
b3arpsl Dec 20, 2023
fae0f3d
cover new default values for config in slzebriumexporter gotest
watercraft Dec 20, 2023
5198c10
Add 'slzebriumexporter/' from commit 'fae0f3d2fb0952f735053a9536b1ac2…
b3arpsl Jan 3, 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
1 change: 1 addition & 0 deletions slzebriumexporter/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
include ../Makefile.Common
92 changes: 92 additions & 0 deletions slzebriumexporter/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
# ScienceLogic Zebrium Exporter

| Status | |
| ------------------------ |-----------|
| Stability | [beta] |
| Supported pipeline types | logs |
| Distributions | [contrib] |

Exports data via HTTP to Zebrium

## Getting Started

The following settings are required:

- `endpoint` (no default): The target URL to send Zebrium log streams to (e.g.: `https://cloud.zebrium.com`).
- `ze_token` (no default): Authorization token for the Zebrium deployment

Optional settings:

- `verbosity` (default 'normal'): Use 'detailed' to log all incoming log records

The ScienceLogic Zebrium Exporter relies on the [ScienceLogic Log Format Processor](https://github.com/open-telemetry/opentelemetry-collector-contrib/processor/sllogformatprocessor/README.md)
to populate the following attributes:

- `sl_metadata`: Resource attribute with encoded metadata that identifies logs from a single application instance
- `sl_msg`: Log record attribute with the body of the log message formated for ScienceLogic
- `sl_format`: Format option from the matching profile, e.g. event

The following example shows how to configure the format processor and exporter in a pipeline:

```yaml
receivers:
windowseventlog:
channel: application
start_at: end

processors:
sllogformat:
send_batch_size: 10000
timeout: 10s
profiles:
- service_group: # windows event log
exp:
source: lit:default
rename: ze_deployment_name
host:
exp:
source: body:computer
rename: host
logbasename:
exp:
op: lc
exps:
- op: alphanum
exps:
- op: rmprefix
exps:
- source: body:provider.name
- source: lit:Microsoft-Windows-
rename: logbasename
message:
exp:
op: or
exps:
- source: body:message
- source: body:event_data
- source: body:keywords
format: event

exporters:
slzebrium:
verbosity: detailed
endpoint: https://cloud.zebrium.com
ze_token: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

service:
pipelines:
logs:
receivers: [windowseventlog]
processors: [sllogformat]
exporters: [slzebrium]
```

## Advanced Configuration

Several helper files are leveraged to provide additional capabilities automatically:

- [HTTP settings](https://github.com/open-telemetry/opentelemetry-collector/blob/main/config/confighttp/README.md)
- [Queuing and retry settings](https://github.com/open-telemetry/opentelemetry-collector/blob/main/exporter/exporterhelper/README.md)

[beta]:https://github.com/open-telemetry/opentelemetry-collector#beta
[contrib]:https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib
104 changes: 104 additions & 0 deletions slzebriumexporter/config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
// Copyright The OpenTelemetry Authors
//
// Licensed 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 slzebriumexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/slzebriumexporter"

import (
"encoding/hex"
"errors"
"fmt"
"net/url"

"go.uber.org/zap/zapcore"

"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/config/confighttp"
"go.opentelemetry.io/collector/config/configtelemetry"
"go.opentelemetry.io/collector/confmap"
"go.opentelemetry.io/collector/exporter/exporterhelper"
)

var (
// supportedLevels in this exporter's configuration.
// configtelemetry.LevelNone and other future values are not supported.
supportedLevels map[configtelemetry.Level]struct{} = map[configtelemetry.Level]struct{}{
configtelemetry.LevelBasic: {},
configtelemetry.LevelNormal: {},
configtelemetry.LevelDetailed: {},
}
)

// Config defines configuration for slzebrium exporter.
type Config struct {
confighttp.HTTPClientSettings `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct.
exporterhelper.QueueSettings `mapstructure:"sending_queue"`
exporterhelper.RetrySettings `mapstructure:"retry_on_failure"`

// Verbosity defines the zebrium exporter verbosity.
Verbosity configtelemetry.Level `mapstructure:"verbosity"`

// ZeUrl Zebrium ZAPI authentication token
ZeToken string `mapstructure:"ze_token"`
}

var _ component.Config = (*Config)(nil)
var _ confmap.Unmarshaler = (*Config)(nil)

func mapLevel(level zapcore.Level) (configtelemetry.Level, error) {
switch level {
case zapcore.DebugLevel:
return configtelemetry.LevelDetailed, nil
case zapcore.InfoLevel:
return configtelemetry.LevelNormal, nil
case zapcore.WarnLevel, zapcore.ErrorLevel,
zapcore.DPanicLevel, zapcore.PanicLevel, zapcore.FatalLevel:
// Anything above info is mapped to 'basic' level.
return configtelemetry.LevelBasic, nil
default:
return configtelemetry.LevelNone, fmt.Errorf("log level %q is not supported", level)
}
}

func (cfg *Config) Unmarshal(conf *confmap.Conf) error {
if err := conf.Unmarshal(cfg, confmap.WithErrorUnused()); err != nil {
return err
}
return nil
}

func validateZeToken(token string) error {
if len(token) != 40 {
return errors.New("must be 40 hex characters")
}
dst := make([]byte, hex.DecodedLen(len(token)))
_, err := hex.Decode(dst, []byte(token))
return err
}

// Validate checks if the exporter configuration is valid
func (cfg *Config) Validate() error {
if err := cfg.QueueSettings.Validate(); err != nil {
return fmt.Errorf("queue settings has invalid configuration: %w", err)
}
if _, err := url.ParseRequestURI(cfg.Endpoint); cfg.Endpoint == "" || err != nil {
return fmt.Errorf("\"endpoint\" must be a valid URL")
}
if _, ok := supportedLevels[cfg.Verbosity]; !ok {
return fmt.Errorf("verbosity level %q is not supported", cfg.Verbosity)
}
if err := validateZeToken(cfg.ZeToken); err != nil {
return fmt.Errorf("ze_token invalid: %s", err.Error())
}
return nil
}
Loading