Compare commits
99 Commits
Author | SHA1 | Date |
---|---|---|
|
2c0363e3bd | |
|
3885a33777 | |
|
7a8199d5ae | |
|
0b120d6da4 | |
|
8c24f1073f | |
|
6096134c6b | |
|
83061c5536 | |
|
beb4375088 | |
|
19b55bd0f1 | |
|
87c64c50ca | |
|
2dca2d4219 | |
|
a2c7538cb4 | |
|
ec1f02eb69 | |
|
6897e9d75f | |
|
c56675cf26 | |
|
038f7743cf | |
|
191b961b15 | |
|
739c7d18bd | |
|
765dd4a005 | |
|
bd29893d1a | |
|
f93f3c7904 | |
|
c0e7e6c19b | |
|
a0c34e784d | |
|
97134bd101 | |
|
f41e855f5d | |
|
2573030a3a | |
|
be5b5822ab | |
|
2e5e08d559 | |
|
f306abb797 | |
|
b4cf9f1777 | |
|
3ac5fcbb63 | |
|
0cb12b9427 | |
|
6a9d9d4fac | |
|
9c46d2c14e | |
|
e23afd1c38 | |
|
c9fb02fd0b | |
|
e387e72b42 | |
|
57182b15e7 | |
|
491166b0b4 | |
|
647cbb5d3a | |
|
c05c47f94b | |
|
1f3d15069a | |
|
0b443908b8 | |
|
8b740084e9 | |
|
da71784171 | |
|
4462e30d59 | |
|
1864b1df1d | |
|
2a9ce5d9a4 | |
|
e9f0e38c00 | |
|
b3d5e7c70b | |
|
5bef4a6611 | |
|
20586b04d1 | |
|
57f110769c | |
|
1ddbe5af26 | |
|
9d7389b218 | |
|
2d6cd852f6 | |
|
afca84ff4c | |
|
f31b161e6d | |
|
208e2c3118 | |
|
2d9d7ca9b0 | |
|
2d68bae30c | |
|
20a4ffbe04 | |
|
632252b427 | |
|
5af88e588a | |
|
0adfae2f3a | |
|
9984c05528 | |
|
cd40babe7b | |
|
4ebc68ce71 | |
|
dc19ba5c6e | |
|
4a634b07ce | |
|
58ec197423 | |
|
61bb03a8a6 | |
|
82c2465f22 | |
|
d2c881d3a6 | |
|
6a29f66ca4 | |
|
d85471787a | |
|
b1f3b1aab6 | |
|
b6cd41a2dc | |
|
2424be2710 | |
|
c4fbe29f56 | |
|
520277ddc0 | |
|
b58c9c4273 | |
|
6b77b6b479 | |
|
ce030d7ee4 | |
|
20c3c50109 | |
|
7e4eca8fe9 | |
|
d49dfc794e | |
|
9724de340e | |
|
b792daf085 | |
|
304d59796f | |
|
2bdb8355ea | |
|
2ddf8c518d | |
|
ae60a86cac | |
|
5c158a93e1 | |
|
9e10e874f2 | |
|
97c89d368b | |
|
21f4b096e6 | |
|
7f3654b2cc | |
|
ca111495cd |
|
@ -11,21 +11,21 @@ jobs:
|
|||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
|
||||
- uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0
|
||||
- uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
|
||||
with:
|
||||
go-version: '1.22'
|
||||
go-version: '1.23'
|
||||
check-latest: true
|
||||
cache: true
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v3.2.0
|
||||
uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@c47758b77c9736f4b2ef4073d4d51994fabfe349 # v3.7.1
|
||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
||||
|
||||
- uses: anchore/sbom-action/download-syft@55dc4ee22412511ee8c3142cbea40418e6cec693 # v0.17.8
|
||||
- uses: anchore/sbom-action/download-syft@7b36ad622f042cab6f59a75c2ac24ccb256e9b45 # v0.20.4
|
||||
|
||||
- uses: goreleaser/goreleaser-action@9ed2f89a662bf1735a48bc8557fd212fa902bebf # v6.1.0
|
||||
- uses: goreleaser/goreleaser-action@9c156ee8a17a598857849441385a2041ef570552 # v6.3.0
|
||||
with:
|
||||
install-only: true
|
||||
|
||||
|
|
|
@ -15,13 +15,13 @@ jobs:
|
|||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
- uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0
|
||||
- uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
|
||||
with:
|
||||
go-version: '1.22'
|
||||
go-version: '1.23'
|
||||
cache: false
|
||||
check-latest: true
|
||||
- name: golangci-lint
|
||||
uses: golangci/golangci-lint-action@971e284b6050e8a5849b72094c50ab08da042db8 # v6.1.1
|
||||
uses: golangci/golangci-lint-action@2226d7cb06a077cd73e56eedd38eecad18e5d837 # v6.5.0
|
||||
with:
|
||||
version: v1.59
|
||||
version: v1.61
|
||||
args: --timeout=5m
|
||||
|
|
|
@ -16,23 +16,23 @@ jobs:
|
|||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
|
||||
- uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0
|
||||
- uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
|
||||
with:
|
||||
go-version: '1.22'
|
||||
go-version: '1.23'
|
||||
check-latest: true
|
||||
cache: true
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v3.2.0
|
||||
uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@c47758b77c9736f4b2ef4073d4d51994fabfe349 # v3.7.1
|
||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
||||
|
||||
- uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0
|
||||
- uses: sigstore/cosign-installer@d58896d6a1865668819e1d91763c7751a165e159 # v3.9.2
|
||||
|
||||
- uses: anchore/sbom-action/download-syft@55dc4ee22412511ee8c3142cbea40418e6cec693 # v0.17.8
|
||||
- uses: anchore/sbom-action/download-syft@7b36ad622f042cab6f59a75c2ac24ccb256e9b45 # v0.20.4
|
||||
|
||||
- uses: goreleaser/goreleaser-action@9ed2f89a662bf1735a48bc8557fd212fa902bebf # v6.1.0
|
||||
- uses: goreleaser/goreleaser-action@9c156ee8a17a598857849441385a2041ef570552 # v6.3.0
|
||||
with:
|
||||
install-only: true
|
||||
|
||||
|
@ -47,7 +47,7 @@ jobs:
|
|||
|
||||
# Push images to DockerHUB
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0
|
||||
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USER }}
|
||||
password: ${{ secrets.DOCKERHUB_SECRET }}
|
||||
|
@ -63,7 +63,7 @@ jobs:
|
|||
|
||||
# Push images to AWS Public ECR
|
||||
- name: Configure AWS credentials
|
||||
uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2
|
||||
uses: aws-actions/configure-aws-credentials@b47578312673ae6fa5b5096b330d9fbac3d116df # v4.2.1
|
||||
with:
|
||||
role-to-assume: arn:aws:iam::292999226676:role/github_actions-falcosidekick-ecr
|
||||
aws-region: us-east-1
|
||||
|
|
|
@ -20,31 +20,31 @@ jobs:
|
|||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
|
||||
- uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0
|
||||
- uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
|
||||
with:
|
||||
go-version: '1.22'
|
||||
go-version: '1.23'
|
||||
check-latest: true
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v3.2.0
|
||||
uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@c47758b77c9736f4b2ef4073d4d51994fabfe349 # v3.7.1
|
||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
||||
|
||||
- uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0
|
||||
- uses: sigstore/cosign-installer@d58896d6a1865668819e1d91763c7751a165e159 # v3.9.2
|
||||
|
||||
- uses: anchore/sbom-action/download-syft@55dc4ee22412511ee8c3142cbea40418e6cec693 # v0.17.8
|
||||
- uses: anchore/sbom-action/download-syft@7b36ad622f042cab6f59a75c2ac24ccb256e9b45 # v0.20.4
|
||||
|
||||
# Push images to DockerHUB
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0
|
||||
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USER }}
|
||||
password: ${{ secrets.DOCKERHUB_SECRET }}
|
||||
|
||||
# Push images to AWS Public ECR
|
||||
- name: Configure AWS credentials
|
||||
uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2
|
||||
uses: aws-actions/configure-aws-credentials@b47578312673ae6fa5b5096b330d9fbac3d116df # v4.2.1
|
||||
with:
|
||||
role-to-assume: arn:aws:iam::292999226676:role/github_actions-falcosidekick-ecr
|
||||
aws-region: us-east-1
|
||||
|
@ -68,7 +68,7 @@ jobs:
|
|||
|
||||
- name: Run GoReleaser
|
||||
id: run-goreleaser
|
||||
uses: goreleaser/goreleaser-action@9ed2f89a662bf1735a48bc8557fd212fa902bebf # v6.1.0
|
||||
uses: goreleaser/goreleaser-action@9c156ee8a17a598857849441385a2041ef570552 # v6.3.0
|
||||
with:
|
||||
version: latest
|
||||
args: release --clean --timeout 120m --parallelism 1
|
||||
|
@ -92,7 +92,7 @@ jobs:
|
|||
actions: read # To read the workflow path.
|
||||
id-token: write # To sign the provenance.
|
||||
contents: write # To add assets to a release.
|
||||
uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v2.0.0
|
||||
uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v2.1.0
|
||||
with:
|
||||
base64-subjects: "${{ needs.release.outputs.hashes }}"
|
||||
upload-assets: true
|
||||
|
|
|
@ -15,9 +15,9 @@ jobs:
|
|||
|
||||
steps:
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
- uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # v5.1.0
|
||||
- uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0
|
||||
with:
|
||||
go-version: '1.22'
|
||||
go-version: '1.23'
|
||||
check-latest: true
|
||||
cache: true
|
||||
- name: Run Go tests
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
run:
|
||||
deadline: 5m
|
||||
timeout: 5m
|
||||
issues:
|
||||
exclude-files:
|
||||
- "zz_generated.*\\.go$"
|
||||
|
@ -18,7 +18,3 @@ linters:
|
|||
- unused
|
||||
# Run with --fast=false for more extensive checks
|
||||
fast: true
|
||||
include:
|
||||
- EXC0002 # include "missing comments" issues from golint
|
||||
max-issues-per-linter: 0
|
||||
max-same-issues: 0
|
||||
|
|
|
@ -10,7 +10,7 @@ env:
|
|||
- COSIGN_YES=true
|
||||
|
||||
snapshot:
|
||||
name_template: 'latest'
|
||||
version_template: 'latest'
|
||||
|
||||
checksum:
|
||||
name_template: 'checksums.txt'
|
||||
|
|
21
CHANGELOG.md
21
CHANGELOG.md
|
@ -1,5 +1,26 @@
|
|||
# Changelog
|
||||
|
||||
## 2.31.1 - 2025-02-04
|
||||
#### Fix
|
||||
- Fix error while closing the writer for `GCPStorage` ([PR#1116](https://github.com/falcosecurity/falcosidekick/pull/1116) thanks to [@chanukya-yekollu-exa](https://github.com/chanukya-yekollu-exa))
|
||||
|
||||
## 2.31.0 - 2025-02-03
|
||||
#### New
|
||||
- New output: **OTLP Logs** ([PR#1109](https://github.com/falcosecurity/falcosidekick/pull/1109))
|
||||
|
||||
#### Enhancement
|
||||
- Add the namespace and the pod name as labels by default in `Loki` payload ([PR#1087](https://github.com/falcosecurity/falcosidekick/pull/1087) thanks to [@afreyermuth98](https://github.com/afreyermuth98))
|
||||
- Allow to set the format for the `Loki` payload to JSON ([PR#1091](https://github.com/falcosecurity/falcosidekick/pull/1091))
|
||||
- Allow to set a template for the subjets for `NATS`/`STAN` outputs ([PR#1099](https://github.com/falcosecurity/falcosidekick/pull/1099))
|
||||
- Improve the logger with a generic and extensible method ([PR#1102](https://github.com/falcosecurity/falcosidekick/pull/1102))
|
||||
|
||||
#### Fix
|
||||
- Remove forgotten debug line ([PR#1088](https://github.com/falcosecurity/falcosidekick/pull/1088))
|
||||
- Fix missing templated fields as labls in `Loki` payload ([PR#1091](https://github.com/falcosecurity/falcosidekick/pull/1091))
|
||||
- Fix creation error of `ClusterPolicyReports` ([PR#1100](https://github.com/falcosecurity/falcosidekick/pull/100))
|
||||
- Fix missing custom headers for HTTP requests for `Loki` ([PR#1107](https://github.com/falcosecurity/falcosidekick/pull/1107) thanks to [@lsroe](https://github.com/lsroe))
|
||||
- Fix wrong key format for `Prometheus` format ([PR#1110](https://github.com/falcosecurity/falcosidekick/pull/1110) thanks to [@rubensf](https://github.com/rubensf))
|
||||
|
||||
## 2.30.0 - 2024-11-28
|
||||
#### New
|
||||
- New output: **Webex** ([PR#979](https://github.com/falcosecurity/falcosidekick/pull/979) thanks to [@k0rventen](https://github.com/k0rventen))
|
||||
|
|
|
@ -116,6 +116,7 @@ Follow the links to get the configuration of each output.
|
|||
- [**SumoLogic**](https://github.com/falcosecurity/falcosidekick/blob/master/docs/outputs/sumologic.md)
|
||||
- [**Quickwit**](https://github.com/falcosecurity/falcosidekick/blob/master/docs/outputs/quickwit.md)
|
||||
- [**Datadog Logs**](https://github.com/falcosecurity/falcosidekick/blob/master/docs/outputs/datadog_logs.md)
|
||||
- [**Logstash**](https://github.com/falcosecurity/falcosidekick/blob/master/docs/outputs/logstash.md)
|
||||
|
||||
### Object Storage
|
||||
|
||||
|
|
95
config.go
95
config.go
|
@ -4,8 +4,6 @@ package main
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/falcosecurity/falcosidekick/outputs/otlpmetrics"
|
||||
"log"
|
||||
"net"
|
||||
"os"
|
||||
"path"
|
||||
|
@ -20,6 +18,8 @@ import (
|
|||
kingpin "github.com/alecthomas/kingpin/v2"
|
||||
"github.com/spf13/viper"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
otlpmetrics "github.com/falcosecurity/falcosidekick/outputs/otlp_metrics"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -145,6 +145,7 @@ var httpOutputDefaults = map[string]map[string]any{
|
|||
"APIKey": "",
|
||||
"MinimumPriority": "",
|
||||
"Tenant": "",
|
||||
"Format": "text",
|
||||
"Endpoint": "/loki/api/v1/push",
|
||||
"ExtraLabels": "",
|
||||
},
|
||||
|
@ -156,14 +157,14 @@ var httpOutputDefaults = map[string]map[string]any{
|
|||
"Name": "",
|
||||
},
|
||||
"STAN": {
|
||||
"HostPort": "",
|
||||
"ClusterID": "",
|
||||
"ClientID": "",
|
||||
"HostPort": "",
|
||||
"ClusterID": "",
|
||||
"ClientID": "",
|
||||
"SubjectTemplate": "falco.<priority>.<rule>",
|
||||
},
|
||||
"NATS": {
|
||||
"HostPort": "",
|
||||
"ClusterID": "",
|
||||
"ClientID": "",
|
||||
"HostPort": "",
|
||||
"SubjectTemplate": "falco.<priority>.<rule>",
|
||||
},
|
||||
"Opsgenie": {
|
||||
"Region": "us",
|
||||
|
@ -413,6 +414,17 @@ var outputDefaults = map[string]map[string]any{
|
|||
"MinimumPriority": "",
|
||||
"CheckCert": true,
|
||||
},
|
||||
"Logstash": {
|
||||
"Address": "",
|
||||
"Port": 5044,
|
||||
"MinimumPriority": "",
|
||||
"MutualTLS": false,
|
||||
"CheckCert": false,
|
||||
"CertFile": "",
|
||||
"KeyFile": "",
|
||||
"CaCertFile": "",
|
||||
"Tags": []string{},
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
|
@ -424,7 +436,7 @@ func init() {
|
|||
|
||||
// Merge http outputs defaults with other outputs defaults
|
||||
if _, ok := outputDefaults[name]; ok {
|
||||
panic(fmt.Sprintf("key %v already set in the output defaults", name))
|
||||
utils.Log(utils.FatalLvl, "", fmt.Sprintf("key %v already set in the output defaults", name))
|
||||
}
|
||||
outputDefaults[name] = dst
|
||||
}
|
||||
|
@ -446,6 +458,7 @@ func getConfig() *types.Configuration {
|
|||
GCP: types.GcpOutputConfig{PubSub: types.GcpPubSub{CustomAttributes: make(map[string]string)}},
|
||||
OTLP: types.OTLPOutputConfig{
|
||||
Traces: types.OTLPTraces{ExtraEnvVars: make(map[string]string)},
|
||||
Logs: types.OTLPLogs{ExtraEnvVars: make(map[string]string)},
|
||||
Metrics: otlpmetrics.Config{ExtraEnvVars: make(map[string]string)},
|
||||
},
|
||||
}
|
||||
|
@ -565,7 +578,7 @@ func getConfig() *types.Configuration {
|
|||
v.SetDefault("Yandex.DataStreams.MinimumPriority", "")
|
||||
|
||||
v.SetDefault("OTLP.Traces.Endpoint", "")
|
||||
v.SetDefault("OTLP.Traces.Protocol", "http/json")
|
||||
v.SetDefault("OTLP.Traces.Protocol", "http/protobuf")
|
||||
// NOTE: we don't need to parse the OTLP.Traces.Headers field, as use it to
|
||||
// set OTEL_EXPORTER_OTLP_TRACES_HEADERS (at otlp_traces_init.go), which is then
|
||||
// parsed by the OTLP SDK libs, see
|
||||
|
@ -579,8 +592,19 @@ func getConfig() *types.Configuration {
|
|||
// it to 1000ms by default, override-able via OTLP_DURATION environment variable.
|
||||
v.SetDefault("OTLP.Traces.Duration", 1000)
|
||||
|
||||
v.SetDefault("OTLP.Logs.Endpoint", "")
|
||||
v.SetDefault("OTLP.Logs.Protocol", "http/protobuf")
|
||||
// NOTE: we don't need to parse the OTLP.Logs.Headers field, as use it to
|
||||
// set OTEL_EXPORTER_OTLP_TRACES_HEADERS (at otlp_traces_init.go), which is then
|
||||
// parsed by the OTLP SDK libs, see
|
||||
// https://opentelemetry.io/docs/languages/sdk-configuration/otlp-exporter/#otel_exporter_otlp_logs_headers
|
||||
v.SetDefault("OTLP.Logs.Headers", "")
|
||||
v.SetDefault("OTLP.Logs.Timeout", 10000)
|
||||
v.SetDefault("OTLP.Logs.MinimumPriority", "")
|
||||
v.SetDefault("OTLP.Logs.CheckCert", true)
|
||||
|
||||
v.SetDefault("OTLP.Metrics.Endpoint", "")
|
||||
v.SetDefault("OTLP.Metrics.Protocol", "grpc")
|
||||
v.SetDefault("OTLP.Metrics.Protocol", "http/protobuf")
|
||||
// NOTE: we don't need to parse the OTLP.Metrics.Headers field, as use it to set OTEL_EXPORTER_OTLP_METRICS_HEADERS
|
||||
// (at outputs/otlpmetrics/otlpmetrics.go), which is then parsed by the OTLP SDK libs.
|
||||
v.SetDefault("OTLP.Metrics.Headers", "")
|
||||
|
@ -589,8 +613,6 @@ func getConfig() *types.Configuration {
|
|||
v.SetDefault("OTLP.Metrics.CheckCert", true)
|
||||
v.SetDefault("OTLP.Metrics.ExtraAttributes", "")
|
||||
|
||||
v.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
|
||||
v.AutomaticEnv()
|
||||
if *configFile != "" {
|
||||
d, f := path.Split(*configFile)
|
||||
if d == "" {
|
||||
|
@ -600,9 +622,11 @@ func getConfig() *types.Configuration {
|
|||
v.AddConfigPath(d)
|
||||
err := v.ReadInConfig()
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : Error when reading config file : %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, "", fmt.Sprintf("Error when reading config file : %v", err))
|
||||
}
|
||||
}
|
||||
v.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
|
||||
v.AutomaticEnv()
|
||||
|
||||
v.GetStringSlice("TLSServer.NoTLSPaths")
|
||||
v.GetStringSlice("Customtags")
|
||||
|
@ -621,7 +645,7 @@ func getConfig() *types.Configuration {
|
|||
c.Elasticsearch.CustomHeaders = v.GetStringMapString("Elasticsearch.CustomHeaders")
|
||||
|
||||
if err := v.Unmarshal(c); err != nil {
|
||||
log.Printf("[ERROR] : Error unmarshalling config : %s", err)
|
||||
utils.Log(utils.ErrorLvl, "", fmt.Sprintf("Error unmarshalling config : %s", err))
|
||||
}
|
||||
|
||||
if value, present := os.LookupEnv("TLSSERVER_NOTLSPATHS"); present {
|
||||
|
@ -641,7 +665,7 @@ func getConfig() *types.Configuration {
|
|||
if s := os.Getenv(tagkeys[1][1:]); s != "" {
|
||||
c.Customfields[tagkeys[0]] = s
|
||||
} else {
|
||||
log.Printf("[ERROR] : Can't find env var %v for custom fields", tagkeys[1][1:])
|
||||
utils.Log(utils.ErrorLvl, "", fmt.Sprintf("Can't find env var %v for custom fields", tagkeys[1][1:]))
|
||||
}
|
||||
} else {
|
||||
c.Customfields[tagkeys[0]] = tagkeys[1]
|
||||
|
@ -656,7 +680,7 @@ func getConfig() *types.Configuration {
|
|||
tagkeys := strings.Split(label, ":")
|
||||
if len(tagkeys) == 2 {
|
||||
if _, err := template.New("").Parse(tagkeys[1]); err != nil {
|
||||
log.Printf("[ERROR] : Error parsing templated fields %v : %s", tagkeys[0], err)
|
||||
utils.Log(utils.ErrorPrefix, "", fmt.Sprintf("Error parsing templated fields %v : %s", tagkeys[0], err))
|
||||
} else {
|
||||
c.Templatedfields[tagkeys[0]] = tagkeys[1]
|
||||
}
|
||||
|
@ -664,6 +688,16 @@ func getConfig() *types.Configuration {
|
|||
}
|
||||
}
|
||||
|
||||
if value, present := os.LookupEnv("LOKI_CUSTOMHEADERS"); present {
|
||||
customheaders := strings.Split(value, ",")
|
||||
for _, label := range customheaders {
|
||||
tagkeys := strings.Split(label, ":")
|
||||
if len(tagkeys) == 2 {
|
||||
c.Loki.CustomHeaders[tagkeys[0]] = tagkeys[1]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if value, present := os.LookupEnv("WEBHOOK_CUSTOMHEADERS"); present {
|
||||
customheaders := strings.Split(value, ",")
|
||||
for _, label := range customheaders {
|
||||
|
@ -692,7 +726,7 @@ func getConfig() *types.Configuration {
|
|||
labelName, labelValue, found := strings.Cut(labelData, ":")
|
||||
labelName, labelValue = strings.TrimSpace(labelName), strings.TrimSpace(labelValue)
|
||||
if !promKVNameRegex.MatchString(labelName) {
|
||||
log.Printf("[ERROR] : AlertManager - Extra label name '%v' is not valid", labelName)
|
||||
utils.Log(utils.ErrorLvl, "AlertManager", fmt.Sprintf("Extra label name '%v' is not valid", labelName))
|
||||
} else if found {
|
||||
c.Alertmanager.ExtraLabels[labelName] = labelValue
|
||||
} else {
|
||||
|
@ -707,7 +741,7 @@ func getConfig() *types.Configuration {
|
|||
annotationName, annotationValue, found := strings.Cut(annotationData, ":")
|
||||
annotationName, annotationValue = strings.TrimSpace(annotationName), strings.TrimSpace(annotationValue)
|
||||
if !promKVNameRegex.MatchString(annotationName) {
|
||||
log.Printf("[ERROR] : AlertManager - Extra annotation name '%v' is not valid", annotationName)
|
||||
utils.Log(utils.ErrorLvl, "AlertManager", fmt.Sprintf("Extra annotation name '%v' is not valid", annotationName))
|
||||
} else if found {
|
||||
c.Alertmanager.ExtraAnnotations[annotationName] = annotationValue
|
||||
} else {
|
||||
|
@ -722,12 +756,12 @@ func getConfig() *types.Configuration {
|
|||
priorityString, severityValue, found := strings.Cut(severitymatch, ":")
|
||||
priority := types.Priority(priorityString)
|
||||
if priority == types.Default {
|
||||
log.Printf("[ERROR] : AlertManager - Priority '%v' is not a valid falco priority level", priorityString)
|
||||
utils.Log(utils.ErrorLvl, "AlertManager", fmt.Sprintf("Priority '%v' is not a valid falco priority level", priorityString))
|
||||
continue
|
||||
} else if found {
|
||||
c.Alertmanager.CustomSeverityMap[priority] = strings.TrimSpace(severityValue)
|
||||
} else {
|
||||
log.Printf("[ERROR] : AlertManager - No severity given to '%v' (tuple extracted: '%v')", priorityString, severitymatch)
|
||||
utils.Log(utils.ErrorLvl, "AlertManager", fmt.Sprintf("No severity given to '%v' (tuple extracted: '%v')", priorityString, severitymatch))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -762,7 +796,7 @@ func getConfig() *types.Configuration {
|
|||
envName, envValue, found := strings.Cut(extraEnvVarData, ":")
|
||||
envName, envValue = strings.TrimSpace(envName), strings.TrimSpace(envValue)
|
||||
if !promKVNameRegex.MatchString(envName) {
|
||||
log.Printf("[ERROR] : OTLPTraces - Extra Env Var name '%v' is not valid", envName)
|
||||
utils.Log(utils.ErrorLvl, "OTLP Traces", fmt.Sprintf("Extra Env Var name '%v' is not valid", envName))
|
||||
} else if found {
|
||||
c.OTLP.Traces.ExtraEnvVars[envName] = envValue
|
||||
} else {
|
||||
|
@ -777,7 +811,7 @@ func getConfig() *types.Configuration {
|
|||
envName, envValue, found := strings.Cut(extraEnvVarData, ":")
|
||||
envName, envValue = strings.TrimSpace(envName), strings.TrimSpace(envValue)
|
||||
if !promKVNameRegex.MatchString(envName) {
|
||||
log.Printf("[ERROR] : OTLPMetrics - Extra Env Var name '%v' is not valid", envName)
|
||||
utils.Log(utils.ErrorLvl, "OTLP Metrics", fmt.Sprintf("Extra Env Var name '%v' is not valid", envName))
|
||||
} else if found {
|
||||
c.OTLP.Metrics.ExtraEnvVars[envName] = envValue
|
||||
} else {
|
||||
|
@ -794,15 +828,15 @@ func getConfig() *types.Configuration {
|
|||
}
|
||||
|
||||
if c.ListenPort == 0 || c.ListenPort > 65536 {
|
||||
log.Fatalf("[ERROR] : Bad listening port number\n")
|
||||
utils.Log(utils.FatalLvl, "", "Bad listening port number")
|
||||
}
|
||||
|
||||
if c.TLSServer.NoTLSPort == 0 || c.TLSServer.NoTLSPort > 65536 {
|
||||
log.Fatalf("[ERROR] : Bad noTLS server port number\n")
|
||||
utils.Log(utils.FatalLvl, "", "Bad noTLS server port number")
|
||||
}
|
||||
|
||||
if ip := net.ParseIP(c.ListenAddress); c.ListenAddress != "" && ip == nil {
|
||||
log.Fatalf("[ERROR] : Failed to parse ListenAddress")
|
||||
utils.Log(utils.FatalLvl, "", "Failed to parse ListenAddress")
|
||||
}
|
||||
|
||||
if c.Loki.ExtraLabels != "" {
|
||||
|
@ -839,17 +873,17 @@ func getConfig() *types.Configuration {
|
|||
for _, threshold := range thresholds {
|
||||
values := strings.SplitN(threshold, ":", 2)
|
||||
if len(values) != 2 {
|
||||
log.Printf("[ERROR] : AlertManager - Fail to parse threshold - No priority given for threshold %v", threshold)
|
||||
utils.Log(utils.ErrorLvl, "AlertManager", fmt.Sprintf("Fail to parse threshold - No priority given for threshold %v", threshold))
|
||||
continue
|
||||
}
|
||||
valueString := strings.TrimSpace(values[0])
|
||||
valueInt, err := strconv.ParseInt(valueString, 10, 64)
|
||||
if len(values) != 2 || err != nil {
|
||||
log.Printf("[ERROR] : AlertManager - Fail to parse threshold - Atoi fail %v", threshold)
|
||||
utils.Log(utils.ErrorLvl, "AlertManager", fmt.Sprintf("Fail to parse threshold - Atoi fail %v", threshold))
|
||||
continue
|
||||
}
|
||||
if p := strings.TrimSpace(values[1]); p == "" {
|
||||
log.Printf("[ERROR] : AlertManager - Priority '%v' is not a valid falco priority level", p)
|
||||
utils.Log(utils.ErrorLvl, "AlertManager", fmt.Sprintf("Priority '%v' is not a valid falco priority level", p))
|
||||
continue
|
||||
}
|
||||
priority := types.Priority(strings.TrimSpace(values[1]))
|
||||
|
@ -924,6 +958,7 @@ func getConfig() *types.Configuration {
|
|||
c.SumoLogic.MinimumPriority = checkPriority(c.SumoLogic.MinimumPriority)
|
||||
c.OTLP.Metrics.MinimumPriority = checkPriority(c.OTLP.Metrics.MinimumPriority)
|
||||
c.Talon.MinimumPriority = checkPriority(c.Talon.MinimumPriority)
|
||||
c.Logstash.MinimumPriority = checkPriority(c.Logstash.MinimumPriority)
|
||||
|
||||
c.Slack.MessageFormatTemplate = getMessageFormatTemplate("Slack", c.Slack.MessageFormat)
|
||||
c.Rocketchat.MessageFormatTemplate = getMessageFormatTemplate("Rocketchat", c.Rocketchat.MessageFormat)
|
||||
|
@ -948,7 +983,7 @@ func getMessageFormatTemplate(output, temp string) *template.Template {
|
|||
var err error
|
||||
t, err := template.New(output).Parse(temp)
|
||||
if err != nil {
|
||||
log.Fatalf("[ERROR] : Error compiling %v message template : %v\n", output, err)
|
||||
utils.Log(utils.FatalLvl, output, fmt.Sprintf("Error compiling message template : %v", err))
|
||||
}
|
||||
return t
|
||||
}
|
||||
|
|
|
@ -156,6 +156,7 @@ loki:
|
|||
# mutualtls: false # if true, checkcert flag will be ignored (server cert will always be checked)
|
||||
# checkcert: true # check if ssl certificate of the output is valid (default: true)
|
||||
# tenant: "" # Add the Tenant header
|
||||
# format: "text" # Format for the log entry value: json, text (default)
|
||||
# endpoint: "/loki/api/v1/push" # The endpoint URL path, default is "/loki/api/v1/push" more info : https://grafana.com/docs/loki/latest/api/#post-apiprompush
|
||||
# extralabels: "" # comma separated list of fields to use as labels additionally to rule, source, priority, tags and custom_fields
|
||||
# customHeaders: # Custom headers to add in POST, useful for Authentication
|
||||
|
@ -163,6 +164,7 @@ loki:
|
|||
|
||||
nats:
|
||||
# hostport: "" # nats://{domain or ip}:{port}, if not empty, NATS output is enabled
|
||||
# subjecttemplate: "falco.<priority>.<rule>" # template for the subject, tokens <priority> and <rule> will be automatically replaced (default: falco.<priority>.<rule>)
|
||||
# minimumpriority: "" # minimum priority of event for using this output, order is emergency|alert|critical|error|warning|notice|informational|debug or "" (default)
|
||||
# mutualtls: false # if true, checkcert flag will be ignored (server cert will always be checked)
|
||||
# checkcert: true # check if ssl certificate of the output is valid (default: true)
|
||||
|
@ -171,6 +173,7 @@ stan:
|
|||
# hostport: "" # nats://{domain or ip}:{port}, if not empty, STAN output is enabled
|
||||
# clusterid: "" # Cluster name, if not empty, STAN output is enabled
|
||||
# clientid: "" # Client ID, if not empty, STAN output is enabled
|
||||
# subjecttemplate: "falco.<priority>.<rule>" # template for the subject, tokens <priority> and <rule> will be automatically replaced (default: falco.<priority>.<rule>)
|
||||
# minimumpriority: "" # minimum priority of event for using this output, order is emergency|alert|critical|error|warning|notice|informational|debug or "" (default)
|
||||
# mutualtls: false # if true, checkcert flag will be ignored (server cert will always be checked)
|
||||
# checkcert: true # check if ssl certificate of the output is valid (default: true)
|
||||
|
@ -537,7 +540,7 @@ sumologic:
|
|||
|
||||
otlp:
|
||||
traces:
|
||||
# endpoint: "" # OTLP endpoint in the form of http://{domain or ip}:4318/v1/traces
|
||||
# endpoint: "" # OTLP endpoint in the form of http(s)://{domain or ip}:4318(/v1/traces), if not empty, OTLP Traces output is enabled
|
||||
# protocol: "" # OTLP protocol http/json, http/protobuf, grpc (default: "" which uses SDK default: http/json)
|
||||
# timeout: "" # OTLP timeout: timeout value in milliseconds (default: "" which uses SDK default: 10000)
|
||||
# headers: "" # OTLP headers: list of headers to apply to all outgoing traces in the form of "some-key=some-value,other-key=other-value" (default: "")
|
||||
|
@ -548,9 +551,18 @@ otlp:
|
|||
# OTEL_EXPORTER_OTLP_TIMEOUT: 10000
|
||||
# minimumpriority: "" # minimum priority of event for using this output, order is emergency|alert|critical|error|warning|notice|informational|debug or "" (default)
|
||||
# checkcert: true # Set if you want to skip TLS certificate validation (default: true)
|
||||
|
||||
logs:
|
||||
# endpoint: "" # OTLP endpoint in the form of http(s)://{domain or ip}:4318(/v1/logs), if not empty, OTLP Traces output is enabled
|
||||
# protocol: "" # OTLP protocol http/json, http/protobuf, grpc (default: "" which uses SDK default: http/json)
|
||||
# timeout: "" # OTLP timeout: timeout value in milliseconds (default: "" which uses SDK default: 10000)
|
||||
# headers: "" # OTLP headers: list of headers to apply to all outgoing traces in the form of "some-key=some-value,other-key=other-value" (default: "")
|
||||
# extraenvvars: # Extra env vars (override the other settings)
|
||||
# OTEL_EXPORTER_OTLP_TRACES_TIMEOUT: 10000
|
||||
# OTEL_EXPORTER_OTLP_TIMEOUT: 10000
|
||||
# minimumpriority: "" # minimum priority of event for using this output, order is emergency|alert|critical|error|warning|notice|informational|debug or "" (default)
|
||||
# checkcert: true # Set if you want to skip TLS certificate validation (default: true)
|
||||
metrics:
|
||||
# endpoint: "" # OTLP endpoint, typically in the form http{s}://{domain or ip}:4318/v1/metrics
|
||||
# endpoint: "" # OTLP endpoint, typically in the form http(s)://{domain or ip}:4318(/v1/metrics), if not empty, OTLP Metrics output is enabled
|
||||
# protocol: "" # OTLP transport protocol to be used for metrics data; it can be "grpc" or "http/protobuf" (default: "grpc")
|
||||
# timeout: "" # OTLP timeout for outgoing metrics in milliseconds (default: "" which uses SDK default: 10000)
|
||||
# headers: "" # List of headers to apply to all outgoing metrics in the form of "some-key=some-value,other-key=other-value" (default: "")
|
||||
|
@ -564,4 +576,16 @@ otlp:
|
|||
talon:
|
||||
# address: "" # Falco talon address, if not empty, Falco Talon output is enabled
|
||||
# checkcert: false # check if ssl certificate of the output is valid (default: true)
|
||||
# minimumpriority: "" # minimum priority of event for using this output, order is emergency|alert|critical|error|warning|notice|informational|debug or "" (default)
|
||||
# minimumpriority: "" # minimum priority of event for using this output, order is emergency|alert|critical|error|warning|notice|informational|debug or "" (default)
|
||||
|
||||
logstash:
|
||||
# address: "" # Logstash address, if not empty, Logstash output is enabled
|
||||
# port: 5044 # Logstash port number (default: 5044)
|
||||
# tls: false # communicate over tls; requires Logstash version 8+ to work
|
||||
# mutualtls: false # or authenticate to the output with TLS; if true, checkcert flag will be ignored (server cert will always be checked) (default: false)
|
||||
# checkcert: true # Check if ssl certificate of the output is valid (default: true)
|
||||
# certfile: "" # Use this certificate file instead of the client certificate when using mutual TLS (default: "")
|
||||
# keyfile: "" # Use this key file instead of the client certificate when using mutual TLS (default: "")
|
||||
# cacertfile: "" # Use this CA certificate file instead of the client certificate when using mutual TLS (default: "")
|
||||
# minimumpriority: minimum priority of event for using this output, order is emergency|alert|critical|error|warning|notice|informational|debug or "" (default: "debug")
|
||||
# tags: ["falco"] # An additional list of tags that will be added to those produced by Falco (default: [])
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
# Logstash
|
||||
|
||||
- **Category**: Logs
|
||||
- **Website**: https://github.com/elastic/logstash
|
||||
|
||||
## Table of content
|
||||
|
||||
- [Logstash](#logstash)
|
||||
- [Table of content](#table-of-content)
|
||||
- [Configuration](#configuration)
|
||||
- [Example of config.yaml](#example-of-configyaml)
|
||||
- [Additional info](#additional-info)
|
||||
- [Screenshots](#screenshots)
|
||||
|
||||
## Configuration
|
||||
|
||||
| Setting | Env var | Default value | Description |
|
||||
| -------------------------- | -------------------------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `logstash.address` | `LOGSTASH_ADDRESS` | | Logstash address, if not empty, Logstash output is **enabled** |
|
||||
| `logstash.port` | `LOGSTASH_PORT` | 5044 | Logstash port number |
|
||||
| `logstash.tls` | `LOGSTASH_TLS` | false | Use TLS connection (true/false) |
|
||||
| `logstash.mutualtls` | `LOGSTASH_MUTUALTLS` | false | Authenticate to the output with TLS; if true, checkcert flag will be ignored (server cert will always be checked) |
|
||||
| `logstash.checkcert` | `LOGSTASH_CHECKCERT` | true | Check if ssl certificate of the output is valid |
|
||||
| `logstash.certfile` | `LOGSTASH_CERTFILE` | | Use this certificate file instead of the client certificate when using mutual TLS |
|
||||
| `logstash.keyfile` | `LOGSTASH_KEYFILE` | | Use this key file instead of the client certificate when using mutual TLS |
|
||||
| `logstash.cacertfile` | `LOGSTASH_CACERTFILE` | | Use this CA certificate file instead of the client certificate when using mutual TLS |
|
||||
| `logstash.minimumpriority` | `LOGSTASH_MINIMUMPRIORITY` | `""` (= `debug`) | Minimum priority of event for using this output, order is `emergency,alert,critical,error,warning,notice,informational,debug or ""` |
|
||||
| `logstash.tags` | `LOGSTASH_TAGS` | | An additional list of tags that will be added to those produced by Falco; these tags may help in decision-making while routing logs |
|
||||
|
||||
> [!NOTE]
|
||||
Values stored in environment variables will override the settings from yaml file.
|
||||
|
||||
## Example of config.yaml
|
||||
|
||||
```yaml
|
||||
logstash:
|
||||
address: "" # Logstash address, if not empty, Logstash output is enabled
|
||||
# port: 5044 # Logstash port number (default: 5044)
|
||||
# tls: false # communicate over tls; requires Logstash version 8+ to work
|
||||
# mutualtls: false # or authenticate to the output with TLS; if true, checkcert flag will be ignored (server cert will always be checked) (default: false)
|
||||
# checkcert: true # Check if ssl certificate of the output is valid (default: true)
|
||||
# certfile: "" # Use this certificate file instead of the client certificate when using mutual TLS (default: "")
|
||||
# keyfile: "" # Use this key file instead of the client certificate when using mutual TLS (default: "")
|
||||
# cacertfile: "" # Use this CA certificate file instead of the client certificate when using mutual TLS (default: "")
|
||||
# minimumpriority: minimum priority of event for using this output, order is emergency|alert|critical|error|warning|notice|informational|debug or "" (default: "debug")
|
||||
# tags: ["falco"] # An additional list of tags that will be added to those produced by Falco (default: [])
|
||||
```
|
||||
|
||||
## Additional info
|
||||
|
||||
## Screenshots
|
|
@ -14,18 +14,19 @@
|
|||
|
||||
## Configuration
|
||||
|
||||
| Setting | Env var | Default value | Description |
|
||||
| ---------------------- | ---------------------- | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `loki.hostport` | `LOKI_HOSTPORT` | | http://{domain or ip}:{port}, if not empty, Loki output is **enabled** |
|
||||
| `loki.user` | `LOKI_USER` | | User for Grafana Logs |
|
||||
| `loki.apikey` | `LOKI_APIKEY` | | API KEy for Grafana Logs |
|
||||
| `loki.tenant` | `LOKI_TENANT` | | Add the tenant header if needed |
|
||||
| `loki.endpoint` | `LOKI_ENDPOINT` | `/loki/api/v1/push` | The endpoint URL path, more info : https://grafana.com/docs/loki/latest/api/#post-apiprompush |
|
||||
| `loki.extralabels` | `LOKI_EXTRALABELS` | | comma separated list of fields to use as labels additionally to `rule`, `source`, `priority`, `tags` and `custom_fields` |
|
||||
| `loki.customheaders` | `LOKI_CUSTOMHEADERS` | | Custom headers to add in POST, useful for Authentication |
|
||||
| `loki.mutualtls` | `LOKI_MUTUALTLS` | `false` | Authenticate to the output with TLS, if true, checkcert flag will be ignored (server cert will always be checked) |
|
||||
| `loki.checkcert` | `LOKI_CHECKCERT` | `/api/v1/alerts` | Check if ssl certificate of the output is valid | `mattermost.minimumpriority` | `MATTERMOST_MINIMUMPRIORITY` | `""` (= `debug`) | Minimum priority of event for using this output, order is `emergency,alert,critical,error,warning,notice,informational,debug or ""`
|
||||
| `loki.minimumpriority` | `LOKI_MINIMUMPRIORITY` | `""` (= `debug`) | Minimum priority of event for using this output, order is `emergency,alert,critical,error,warning,notice,informational,debug or ""` |
|
||||
| Setting | Env var | Default value | Description | | | | |
|
||||
| ---------------------- | ---------------------- | ------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | ---------------------------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `loki.hostport` | `LOKI_HOSTPORT` | | http://{domain or ip}:{port}, if not empty, Loki output is **enabled** | | | | |
|
||||
| `loki.user` | `LOKI_USER` | | User for Grafana Logs | | | | |
|
||||
| `loki.apikey` | `LOKI_APIKEY` | | API KEy for Grafana Logs | | | | |
|
||||
| `loki.tenant` | `LOKI_TENANT` | | Add the tenant header if needed | | | | |
|
||||
| `loki.format` | `LOKI_FORMAT` | `text` | Format for the log entry value: json, text | | | | |
|
||||
| `loki.endpoint` | `LOKI_ENDPOINT` | `/loki/api/v1/push` | The endpoint URL path, more info : https://grafana.com/docs/loki/latest/api/#post-apiprompush | | | | |
|
||||
| `loki.extralabels` | `LOKI_EXTRALABELS` | | comma separated list of fields to use as labels additionally to `rule`, `source`, `priority`, `tags` and `custom_fields` | | | | |
|
||||
| `loki.customheaders` | `LOKI_CUSTOMHEADERS` | | Custom headers to add in POST, useful for Authentication | | | | |
|
||||
| `loki.mutualtls` | `LOKI_MUTUALTLS` | `false` | Authenticate to the output with TLS, if true, checkcert flag will be ignored (server cert will always be checked) | | | | |
|
||||
| `loki.checkcert` | `LOKI_CHECKCERT` | `/api/v1/alerts` | Check if ssl certificate of the output is valid | `mattermost.minimumpriority` | `MATTERMOST_MINIMUMPRIORITY` | `""` (= `debug`) | Minimum priority of event for using this output, order is `emergency,alert,critical,error,warning,notice,informational,debug or ""` |
|
||||
| `loki.minimumpriority` | `LOKI_MINIMUMPRIORITY` | `""` (= `debug`) | Minimum priority of event for using this output, order is `emergency,alert,critical,error,warning,notice,informational,debug or ""` | | | | |
|
||||
|
||||
|
||||
> [!NOTE]
|
||||
|
@ -41,6 +42,7 @@ loki:
|
|||
# minimumpriority: "" # minimum priority of event for using this output, order is emergency|alert|critical|error|warning|notice|informational|debug or "" (default)
|
||||
# checkcert: true # check if ssl certificate of the output is valid (default: true)
|
||||
# tenant: "" # Add the tenant header if needed. Enabled if not empty
|
||||
# format: "text" # Format for the log entry value: json, text (default)
|
||||
# endpoint: "/loki/api/v1/push" # The endpoint URL path, default is "/loki/api/v1/push" more info : https://grafana.com/docs/loki/latest/api/#post-apiprompush
|
||||
# extralabels: "" # comma separated list of fields to use as labels additionally to rule, source, priority, tags and custom_fields
|
||||
# customHeaders: # Custom headers to add in POST, useful for Authentication
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
|
||||
- **Category**: Chat/Messaging
|
||||
- **Website**: https://rocket.chat
|
||||
- **Website**: https://github.com/mattermost/mattermost
|
||||
|
||||
## Table of content
|
||||
|
||||
|
@ -65,4 +65,4 @@ Go templates also support some basic methods for text manipulation which can be
|
|||
|
||||
## Screenshots
|
||||
|
||||

|
||||

|
||||
|
|
|
@ -8,18 +8,23 @@
|
|||
- [NATS](#nats)
|
||||
- [Table of content](#table-of-content)
|
||||
- [Configuration](#configuration)
|
||||
- [subjecttemplate: "falco.." # template for the subject, tokens and will be automatically replaced (default: falco..)](#subjecttemplate-falco--template-for-the-subject-tokens--and--will-be-automatically-replaced-default-falco)
|
||||
- [Example of config.yaml](#example-of-configyaml)
|
||||
- [Additional info](#additional-info)
|
||||
- [Screenshots](#screenshots)
|
||||
|
||||
## Configuration
|
||||
|
||||
| Setting | Env var | Default value | Description |
|
||||
| ---------------------- | ---------------------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `nats.hostport` | `NATS_HOSTPORT` | | nats://{domain or ip}:{port}, if not empty, NATS output is **enabled** |
|
||||
| `nats.mutualtls` | `NATS_MUTUALTLS` | `false` | Authenticate to the output with TLS, if true, checkcert flag will be ignored (server cert will always be checked) |
|
||||
| `nats.checkcert` | `NATS_CHECKCERT` | `true` | Check if ssl certificate of the output is valid |
|
||||
| `nats.minimumpriority` | `NATS_MINIMUMPRIORITY` | `""` (= `debug`) | Minimum priority of event for using this output, order is `emergency,alert,critical,error,warning,notice,informational,debug or ""` |
|
||||
# subjecttemplate: "falco.<priority>.<rule>" # template for the subject, tokens <priority> and <rule> will be automatically replaced (default: falco.<priority>.<rule>)
|
||||
|
||||
|
||||
| Setting | Env var | Default value | Description |
|
||||
| ---------------------- | ---------------------- | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `nats.hostport` | `NATS_HOSTPORT` | | nats://{domain or ip}:{port}, if not empty, NATS output is **enabled** |
|
||||
| `nats.subjecttemplate` | `NATS_SUBJECTTEMPLATE` | `falco.<priority>.<rule>` | Template for the subject, tokens <priority> and <rule> will be automatically replaced |
|
||||
| `nats.mutualtls` | `NATS_MUTUALTLS` | `false` | Authenticate to the output with TLS, if true, checkcert flag will be ignored (server cert will always be checked) |
|
||||
| `nats.checkcert` | `NATS_CHECKCERT` | `true` | Check if ssl certificate of the output is valid |
|
||||
| `nats.minimumpriority` | `NATS_MINIMUMPRIORITY` | `""` (= `debug`) | Minimum priority of event for using this output, order is `emergency,alert,critical,error,warning,notice,informational,debug or ""` |
|
||||
|
||||
> [!NOTE]
|
||||
The Env var values override the settings from yaml file.
|
||||
|
@ -30,6 +35,7 @@ The Env var values override the settings from yaml file.
|
|||
nats:
|
||||
hostport: "" # nats://{domain or ip}:{port}, if not empty, NATS output is enabled
|
||||
# minimumpriority: "" # minimum priority of event for using this output, order is emergency|alert|critical|error|warning|notice|informational|debug or "" (default)
|
||||
# subjecttemplate: "falco.<priority>.<rule>" # template for the subject, tokens <priority> and <rule> will be automatically replaced (default: falco.<priority>.<rule>)
|
||||
# mutualtls: false # if true, checkcert flag will be ignored (server cert will always be checked)
|
||||
# checkcert: true # check if ssl certificate of the output is valid (default: true)
|
||||
```
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
# OTEL Logs
|
||||
|
||||
- **Category**: Logs
|
||||
- **Website**: <https://opentelemetry.io/docs/concepts/signals/logs/>
|
||||
|
||||
## Table of content
|
||||
|
||||
- [OTEL Logs](#otel-logs)
|
||||
- [Table of content](#table-of-content)
|
||||
- [Configuration](#configuration)
|
||||
- [Example of config.yaml](#example-of-configyaml)
|
||||
- [Additional info](#additional-info)
|
||||
|
||||
## Configuration
|
||||
|
||||
| Setting | Env var | Default value | Description |
|
||||
| --------------------------- | --------------------------- | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `otlp.logs.endpoint` | `OTLP_LOGS_ENDPOINT` | | OTLP endpoint in the form of http://{domain or ip}:4318/v1/logs |
|
||||
| `otlp.logs.protocol` | `OTLP_LOGS_PROTOCOL` | `http/protobuf` (from SDK) | OTLP Protocol: `http/protobuf`, `grpc` |
|
||||
| `otlp.logs.timeout` | `OTLP_LOGS_TIMEOUT` | `10000` (from SDK) | Timeout value in milliseconds |
|
||||
| `otlp.logs.headers` | `OTLP_LOGS_HEADERS` | | List of headers to apply to all outgoing logs in the form of "some-key=some-value,other-key=other-value" |
|
||||
| `otlp.logs.synced` | `OTLP_LOGS_SYNCED` | `false` | Set to `true` if you want logs to be sent synchronously |
|
||||
| `otlp.logs.minimumpriority` | `OTLP_LOGS_MINIMUMPRIORITY` | `""` (=`debug`) | minimum priority of event for using this output, order is `emergency,alert,critical,error,warning,notice,informational,debug or ""` |
|
||||
| `otlp.logs.checkcert` | `OTLP_LOGS_CHECKCERT` | `false` | Set if you want to skip TLS certificate validation |
|
||||
| `otlp.logs.duration` | `OTLP_LOGS_DURATION` | `1000` | Artificial span duration in milliseconds (as Falco doesn't provide an ending timestamp) |
|
||||
| `otlp.logs.extraenvvars` | `OTLP_LOGS_EXTRAENVVARS` | | Extra env vars (override the other settings) |
|
||||
|
||||
> [!NOTE]
|
||||
For the extra Env Vars values see [standard `OTEL_*` environment variables](https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/)
|
||||
|
||||
## Example of config.yaml
|
||||
|
||||
```yaml
|
||||
otlp:
|
||||
logs:
|
||||
# endpoint: "" # OTLP endpoint in the form of http(s)://{domain or ip}:4318(/v1/logs), if not empty, OTLP Traces output is enabled
|
||||
protocol: "" # OTLP protocol: http/protobuf, grpc (default: "" which uses SDK default: "http/protobuf")
|
||||
# timeout: "" # OTLP timeout: timeout value in milliseconds (default: "" which uses SDK default: 10000)
|
||||
# headers: "" # OTLP headers: list of headers to apply to all outgoing traces in the form of "some-key=some-value,other-key=other-value" (default: "")
|
||||
# extraenvvars: # Extra env vars (override the other settings)
|
||||
# OTEL_EXPORTER_OTLP_TRACES_TIMEOUT: 10000
|
||||
# OTEL_EXPORTER_OTLP_TIMEOUT: 10000
|
||||
# minimumpriority: "" # minimum priority of event for using this output, order is emergency|alert|critical|error|warning|notice|informational|debug or "" (default)
|
||||
# checkcert: true # Set if you want to skip TLS certificate validation (default: true)
|
||||
```
|
||||
|
||||
## Additional info
|
||||
|
||||
> [!WARNING]
|
||||
Because of the way the OTEL SDK is structured, the OTLP outputs don't appear in the metrics (Prometheus, Statsd, ...)
|
||||
and the error logs just specify `OTEL` as output.
|
|
@ -11,38 +11,45 @@
|
|||
- [Example of config.yaml](#example-of-configyaml)
|
||||
- [Additional info](#additional-info)
|
||||
- [Running a whole stack with docker-compose](#running-a-whole-stack-with-docker-compose)
|
||||
- [Requirements](#requirements)
|
||||
- [Configuration files](#configuration-files)
|
||||
- [Run it](#run-it)
|
||||
|
||||
## Configuration
|
||||
|
||||
| Setting | Env var | Default value | Description |
|
||||
|--------------------------------|--------------------------------|--------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| `otlp.metrics.endpoint` | `OTLP_METRICS_ENDPOINT` | | OTLP endpoint, typically in the form http{s}://{domain or ip}:4318/v1/metrics |
|
||||
| `otlp.metrics.protocol` | `OTLP_METRICS_PROTOCOL` | `grpc` | OTLP transport protocol to be used for metrics data; it can be `"grpc"` or `"http/protobuf"` |
|
||||
| `otlp.metrics.timeout` | `OTLP_METRICS_TIMEOUT` | `10000` (from SDK) | OTLP timeout for outgoing metrics in milliseconds |
|
||||
| `otlp.metrics.headers` | `OTLP_METRICS_HEADERS` | `""` | List of headers to apply to all outgoing metrics in the form of `some-key=some-value,other-key=other-value` |
|
||||
| `otlp.metrics.extraenvvars` | `OTLP_METRICS_EXTRAENVVARS` | `""` | Extra env vars (override the other settings) |
|
||||
| `otlp.metrics.minimumpriority` | `OTLP_METRICS_MINIMUMPRIORITY` | `""` (=`debug`) | Minimum priority of event for using this output, order is `emergency,alert,critical,error,warning,notice,informational,debug or ""` |
|
||||
| `otlp.metrics.checkcert` | `OTLP_METRICS_CHECKCERT` | `true` | Set to false if you want to skip TLS certificate validation (only with https) |
|
||||
| `otlp.metrics.extraattributes` | `OTLP_METRICS_EXTRAATTRIBUTES` | `""` | Comma-separated list of fields to use as labels additionally to source, priority, rule, hostname, tags, k8s_ns_name, k8s_pod_name and custom_fields |
|
||||
| Setting | Env var | Default value | Description |
|
||||
| ------------------------------ | ------------------------------ | -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `otlp.metrics.endpoint` | `OTLP_METRICS_ENDPOINT` | | OTLP endpoint, typically in the form http(s)://{domain or ip}:4318(/v1/metrics) |
|
||||
| `otlp.metrics.protocol` | `OTLP_METRICS_PROTOCOL` | `http/protobuf` (from SDK) | OTLP Protocol: `http/protobuf`, `grpc` |
|
||||
| `otlp.metrics.timeout` | `OTLP_METRICS_TIMEOUT` | `10000` (from SDK) | OTLP timeout for outgoing metrics in milliseconds |
|
||||
| `otlp.metrics.headers` | `OTLP_METRICS_HEADERS` | `""` | List of headers to apply to all outgoing metrics in the form of `some-key=some-value,other-key=other-value` |
|
||||
| `otlp.metrics.extraenvvars` | `OTLP_METRICS_EXTRAENVVARS` | `""` | Extra env vars (override the other settings) |
|
||||
| `otlp.metrics.minimumpriority` | `OTLP_METRICS_MINIMUMPRIORITY` | `""` (=`debug`) | Minimum priority of event for using this output, order is `emergency,alert,critical,error,warning,notice,informational,debug or ""` |
|
||||
| `otlp.metrics.checkcert` | `OTLP_METRICS_CHECKCERT` | `true` | Set to false if you want to skip TLS certificate validation (only with https) |
|
||||
| `otlp.metrics.extraattributes` | `OTLP_METRICS_EXTRAATTRIBUTES` | `""` | Comma-separated list of fields to use as labels additionally to source, priority, rule, hostname, tags, k8s_ns_name, k8s_pod_name and custom_fields |
|
||||
|
||||
> [!NOTE]
|
||||
For the extra Env Vars values see [standard `OTEL_*` environment variables](https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/):
|
||||
For the extra Env Vars values see [standard `OTEL_*` environment variables](https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/)
|
||||
|
||||
> [!WARNING]
|
||||
If you use `grpc`, the endpoint format must be `http(s)://{domain or ip}:4318`
|
||||
If you use `http/protobuf`, the endpoint format must be `http(s)://{domain or ip}:4318/v1/traces`
|
||||
|
||||
## Example of config.yaml
|
||||
|
||||
```yaml
|
||||
otlp:
|
||||
metrics:
|
||||
# endpoint: "" # OTLP endpoint, typically in the form http{s}://{domain or ip}:4318/v1/metrics
|
||||
# protocol: "" # OTLP transport protocol to be used for metrics data; it can be "grpc" or "http/protobuf" (default: "grpc")
|
||||
# timeout: "" # OTLP timeout for outgoing metrics in milliseconds (default: "" which uses SDK default: 10000)
|
||||
# headers: "" # List of headers to apply to all outgoing metrics in the form of "some-key=some-value,other-key=other-value" (default: "")
|
||||
# extraenvvars: # Extra env vars (override the other settings) (default: "")
|
||||
# OTEL_EXPORTER_OTLP_METRICS_TIMEOUT: 10000
|
||||
# OTEL_EXPORTER_OTLP_TIMEOUT: 10000
|
||||
# minimumpriority: "" # Minimum priority of event for using this output, order is emergency|alert|critical|error|warning|notice|informational|debug or "" (default: "")
|
||||
# checkcert: true # Set to false if you want to skip TLS certificate validation (only with https) (default: true)
|
||||
# extraattributes: "" # Comma-separated list of fields to use as labels additionally to source, priority, rule, hostname, tags, k8s_ns_name, k8s_pod_name and custom_fields
|
||||
# endpoint: "" # OTLP endpoint, typically in the form http(s)://{domain or ip}:4318(/v1/metrics), if not empty, OTLP Metrics output is enabled
|
||||
# protocol: "" # OTLP protocol: http/protobuf, grpc (default: "" which uses SDK default: "http/protobuf")
|
||||
# timeout: "" # OTLP timeout for outgoing metrics in milliseconds (default: "" which uses SDK default: 10000)
|
||||
# headers: "" # List of headers to apply to all outgoing metrics in the form of "some-key=some-value,other-key=other-value" (default: "")
|
||||
# extraenvvars: # Extra env vars (override the other settings) (default: "")
|
||||
# OTEL_EXPORTER_OTLP_METRICS_TIMEOUT: 10000
|
||||
# OTEL_EXPORTER_OTLP_TIMEOUT: 10000
|
||||
# minimumpriority: "" # Minimum priority of event for using this output, order is emergency|alert|critical|error|warning|notice|informational|debug or "" (default: "")
|
||||
# checkcert: true # Set to false if you want to skip TLS certificate validation (only with https) (default: true)
|
||||
# extraattributes: "" # Comma-separated list of fields to use as labels additionally to source, priority, rule, hostname, tags, k8s_ns_name, k8s_pod_name and custom_fields
|
||||
```
|
||||
|
||||
## Additional info
|
||||
|
@ -50,6 +57,10 @@ otlp:
|
|||
> [!NOTE]
|
||||
This output is used to collect metrics about Falco events and Falcosidekick inputs and outputs in OTLP metrics format.
|
||||
|
||||
> [!WARNING]
|
||||
Because of the way the OTEL SDK is structured, the OTLP outputs don't appear in the metrics (Prometheus, Statsd, ...)
|
||||
and the error logs just specify `OTEL` as output.
|
||||
|
||||
## Running a whole stack with docker-compose
|
||||
|
||||
Below `docker-compose` file runs a stack of:
|
||||
|
@ -88,7 +99,7 @@ services:
|
|||
"/usr/bin/falco" ,
|
||||
"-o", "json_output=true",
|
||||
"-o", "http_output.enabled=true",
|
||||
"-o", "http_output.url=http://sidekick:2801", # Set the HTTP output url to Falco sidekick endpoint
|
||||
"-o", "http_output.url=http://sidekick:2801", # Set the HTTP output url to Falcosidekick endpoint
|
||||
"-o", "http_output.insecure=true"
|
||||
]
|
||||
|
||||
|
|
|
@ -11,31 +11,38 @@
|
|||
- [Example of config.yaml](#example-of-configyaml)
|
||||
- [Additional info](#additional-info)
|
||||
- [Running a whole stack with docker-compose](#running-a-whole-stack-with-docker-compose)
|
||||
- [Requirements](#requirements)
|
||||
- [Configuration files](#configuration-files)
|
||||
- [Run it](#run-it)
|
||||
|
||||
## Configuration
|
||||
|
||||
| Setting | Env var | Default value | Description |
|
||||
| ----------------------------- | ----------------------------- | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `otlp.traces.endpoint` | `OTLP_TRACES_ENDPOINT` | | OTLP endpoint in the form of http://{domain or ip}:4318/v1/traces |
|
||||
| `otlp.traces.protocol` | `OTLP_TRACES_PROTOCOL` | `http` (from SDK) | OTLP Protocol |
|
||||
| `otlp.traces.timeout` | `OTLP_TRACES_TIMEOUT` | `10000` (from SDK) | Timeout value in milliseconds |
|
||||
| `otlp.traces.headers` | `OTLP_TRACES_HEADERS` | | List of headers to apply to all outgoing traces in the form of "some-key=some-value,other-key=other-value" |
|
||||
| `otlp.traces.synced` | `OTLP_TRACES_SYNCED` | `false` | Set to `true` if you want traces to be sent synchronously |
|
||||
| `otlp.traces.minimumpriority` | `OTLP_TRACES_MINIMUMPRIORITY` | `""` (=`debug`) | minimum priority of event for using this output, order is `emergency,alert,critical,error,warning,notice,informational,debug or ""` |
|
||||
| `otlp.traces.checkcert` | `OTLP_TRACES_CHECKCERT` | `false` | Set if you want to skip TLS certificate validation |
|
||||
| `otlp.traces.duration` | `OTLP_TRACES_DURATION` | `1000` | Artificial span duration in milliseconds (as Falco doesn't provide an ending timestamp) |
|
||||
| `otlp.traces.extraenvvars` | `OTLP_TRACES_EXTRAENVVARS` | | Extra env vars (override the other settings) |
|
||||
| Setting | Env var | Default value | Description |
|
||||
| ----------------------------- | ----------------------------- | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `otlp.traces.endpoint` | `OTLP_TRACES_ENDPOINT` | | OTLP endpoint in the form of http(s)://{domain or ip}:4318(/v1/traces) |
|
||||
| `otlp.traces.protocol` | `OTLP_TRACES_PROTOCOL` | `http/protobuf` (from SDK) | OTLP Protocol: `http/protobuf`, `grpc` |
|
||||
| `otlp.traces.timeout` | `OTLP_TRACES_TIMEOUT` | `10000` (from SDK) | Timeout value in milliseconds |
|
||||
| `otlp.traces.headers` | `OTLP_TRACES_HEADERS` | | List of headers to apply to all outgoing traces in the form of "some-key=some-value,other-key=other-value" |
|
||||
| `otlp.traces.synced` | `OTLP_TRACES_SYNCED` | `false` | Set to `true` if you want traces to be sent synchronously |
|
||||
| `otlp.traces.minimumpriority` | `OTLP_TRACES_MINIMUMPRIORITY` | `""` (=`debug`) | minimum priority of event for using this output, order is `emergency,alert,critical,error,warning,notice,informational,debug or ""` |
|
||||
| `otlp.traces.checkcert` | `OTLP_TRACES_CHECKCERT` | `false` | Set if you want to skip TLS certificate validation |
|
||||
| `otlp.traces.duration` | `OTLP_TRACES_DURATION` | `1000` | Artificial span duration in milliseconds (as Falco doesn't provide an ending timestamp) |
|
||||
| `otlp.traces.extraenvvars` | `OTLP_TRACES_EXTRAENVVARS` | | Extra env vars (override the other settings) |
|
||||
|
||||
> [!NOTE]
|
||||
For the extra Env Vars values see [standard `OTEL_*` environment variables](https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/):
|
||||
For the extra Env Vars values see [standard `OTEL_*` environment variables](https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/)
|
||||
|
||||
> [!WARNING]
|
||||
If you use `grpc`, the endpoint format must be `http(s)://{domain or ip}:4318`
|
||||
If you use `http/protobuf`, the endpoint format must be `http(s)://{domain or ip}:4318/v1/traces`
|
||||
|
||||
## Example of config.yaml
|
||||
|
||||
```yaml
|
||||
otlp:
|
||||
traces:
|
||||
# endpoint: "" # OTLP endpoint in the form of http://{domain or ip}:4318/v1/traces
|
||||
# protocol: "" # OTLP protocol http/json, http/protobuf, grpc (default: "" which uses SDK default: http/json)
|
||||
# endpoint: "" # OTLP endpoint in the form of http(s)://{domain or ip}:4318(/v1/traces), if not empty, OTLP Traces output is enabled
|
||||
# protocol: "" # OTLP protocol: http/protobuf, grpc (default: "" which uses SDK default: "http/protobuf")
|
||||
# timeout: "" # OTLP timeout: timeout value in milliseconds (default: "" which uses SDK default: 10000)
|
||||
# headers: "" # OTLP headers: list of headers to apply to all outgoing traces in the form of "some-key=some-value,other-key=other-value" (default: "")
|
||||
# synced: false # Set to true if you want traces to be sent synchronously (default: false)
|
||||
|
@ -52,6 +59,10 @@ otlp:
|
|||
> [!NOTE]
|
||||
The OTLP Traces are only available for the source: `syscalls`.
|
||||
|
||||
> [!WARNING]
|
||||
Because of the way the OTEL SDK is structured, the OTLP outputs don't appear in the metrics (Prometheus, Statsd, ...)
|
||||
and the error logs just specify `OTEL` as output.
|
||||
|
||||
## Running a whole stack with docker-compose
|
||||
|
||||
Below `docker-compose` file runs a stack of:
|
||||
|
|
|
@ -14,13 +14,14 @@
|
|||
|
||||
## Configuration
|
||||
|
||||
| Setting | Env var | Default value | Description |
|
||||
| ---------------------- | ---------------------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `stan.hostport` | `STAN_HOSTPORT` | | stan://{domain or ip}:{port}, if not empty, STAN output is **enabled** |
|
||||
| `stan.clusterid` | `STAN_CLUSTERID` | | Cluster name (mandatory) |
|
||||
| `stan.clientid` | `STAN_CLIENTID` | | Client ID (mandatory) |
|
||||
| `stan.checkcert` | `STAN_CHECKCERT` | `true` | Check if ssl certificate of the output is valid |
|
||||
| `stan.minimumpriority` | `STAN_MINIMUMPRIORITY` | `""` (= `debug`) | Minimum priority of event for using this output, order is `emergency,alert,critical,error,warning,notice,informational,debug or ""` |
|
||||
| Setting | Env var | Default value | Description |
|
||||
| ---------------------- | ---------------------- | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `stan.hostport` | `STAN_HOSTPORT` | | stan://{domain or ip}:{port}, if not empty, STAN output is **enabled** |
|
||||
| `stan.subjecttemplate` | `STAN_SUBJECTTEMPLATE` | `falco.<priority>.<rule>` | Template for the subject, tokens <priority> and <rule> will be automatically replaced |
|
||||
| `stan.clusterid` | `STAN_CLUSTERID` | | Cluster name (mandatory) |
|
||||
| `stan.clientid` | `STAN_CLIENTID` | | Client ID (mandatory) |
|
||||
| `stan.checkcert` | `STAN_CHECKCERT` | `true` | Check if ssl certificate of the output is valid |
|
||||
| `stan.minimumpriority` | `STAN_MINIMUMPRIORITY` | `""` (= `debug`) | Minimum priority of event for using this output, order is `emergency,alert,critical,error,warning,notice,informational,debug or ""` |
|
||||
|
||||
> [!NOTE]
|
||||
The Env var values override the settings from yaml file.
|
||||
|
@ -32,6 +33,7 @@ stan:
|
|||
hostport: "" # stan://{domain or ip}:{port}, if not empty, STAN output is enabled
|
||||
clusterid: "" # Cluster name (mandatory)
|
||||
clientid: "" # Client ID (mandatory)
|
||||
# subjecttemplate: "falco.<priority>.<rule>" # template for the subject, tokens <priority> and <rule> will be automatically replaced (default: falco.<priority>.<rule>)
|
||||
# minimumpriority: "" # minimum priority of event for using this output, order is emergency|alert|critical|error|warning|notice|informational|debug or "" (default)
|
||||
# mutualtls: false # if true, checkcert flag will be ignored (server cert will always be checked)
|
||||
# checkcert: true # check if ssl certificate of the output is valid (default: true)
|
||||
|
|
233
go.mod
233
go.mod
|
@ -1,178 +1,211 @@
|
|||
module github.com/falcosecurity/falcosidekick
|
||||
|
||||
go 1.22.5
|
||||
go 1.23.0
|
||||
|
||||
toolchain go1.23.4
|
||||
|
||||
require (
|
||||
cloud.google.com/go/functions v1.19.2
|
||||
cloud.google.com/go/pubsub v1.45.1
|
||||
cloud.google.com/go/storage v1.47.0
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0
|
||||
github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs v1.2.3
|
||||
cloud.google.com/go/functions v1.19.6
|
||||
cloud.google.com/go/pubsub v1.49.0
|
||||
cloud.google.com/go/storage v1.56.0
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1
|
||||
github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs v1.3.2
|
||||
github.com/DataDog/datadog-go v4.8.3+incompatible
|
||||
github.com/PagerDuty/go-pagerduty v1.8.0
|
||||
github.com/alecthomas/kingpin/v2 v2.4.0
|
||||
github.com/aws/aws-sdk-go v1.55.5
|
||||
github.com/aws/aws-sdk-go-v2 v1.37.1
|
||||
github.com/aws/aws-sdk-go-v2/config v1.25.3
|
||||
github.com/aws/aws-sdk-go-v2/credentials v1.16.2
|
||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4
|
||||
github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.47.3
|
||||
github.com/aws/aws-sdk-go-v2/service/kinesis v1.35.4
|
||||
github.com/aws/aws-sdk-go-v2/service/lambda v1.74.1
|
||||
github.com/aws/aws-sdk-go-v2/service/s3 v1.83.0
|
||||
github.com/aws/aws-sdk-go-v2/service/sns v1.17.4
|
||||
github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3
|
||||
github.com/aws/aws-sdk-go-v2/service/sts v1.33.19
|
||||
github.com/cloudevents/sdk-go/v2 v2.15.2
|
||||
github.com/eclipse/paho.mqtt.golang v1.5.0
|
||||
github.com/embano1/memlog v0.4.6
|
||||
github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43
|
||||
github.com/emersion/go-smtp v0.21.3
|
||||
github.com/google/go-cmp v0.6.0
|
||||
github.com/emersion/go-sasl v0.0.0-20241020182733-b788ff22d5a6
|
||||
github.com/emersion/go-smtp v0.22.0
|
||||
github.com/google/go-cmp v0.7.0
|
||||
github.com/google/uuid v1.6.0
|
||||
github.com/googleapis/gax-go/v2 v2.14.0
|
||||
github.com/jackc/pgx/v5 v5.7.1
|
||||
github.com/nats-io/nats.go v1.37.0
|
||||
github.com/googleapis/gax-go/v2 v2.15.0
|
||||
github.com/jackc/pgx/v5 v5.7.5
|
||||
github.com/nats-io/nats.go v1.39.1
|
||||
github.com/nats-io/stan.go v0.10.4
|
||||
github.com/prometheus/client_golang v1.20.5
|
||||
github.com/prometheus/client_golang v1.22.0
|
||||
github.com/rabbitmq/amqp091-go v1.10.0
|
||||
github.com/redis/go-redis/v9 v9.7.0
|
||||
github.com/segmentio/kafka-go v0.4.47
|
||||
github.com/redis/go-redis/v9 v9.8.0
|
||||
github.com/segmentio/kafka-go v0.4.48
|
||||
github.com/spf13/viper v1.19.0
|
||||
github.com/stretchr/testify v1.10.0
|
||||
github.com/wavefronthq/wavefront-sdk-go v0.15.0
|
||||
github.com/xitongsys/parquet-go v1.6.2
|
||||
github.com/xitongsys/parquet-go-source v0.0.0-20240122235623-d6294584ab18
|
||||
go.opentelemetry.io/otel v1.32.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0
|
||||
go.opentelemetry.io/otel/metric v1.32.0
|
||||
go.opentelemetry.io/otel/sdk v1.32.0
|
||||
go.opentelemetry.io/otel/sdk/metric v1.32.0
|
||||
go.opentelemetry.io/otel/trace v1.32.0
|
||||
golang.org/x/oauth2 v0.24.0
|
||||
golang.org/x/sync v0.9.0
|
||||
golang.org/x/text v0.20.0
|
||||
google.golang.org/api v0.209.0
|
||||
google.golang.org/genproto v0.0.0-20241113202542-65e8d215514f
|
||||
k8s.io/api v0.31.3
|
||||
k8s.io/apimachinery v0.31.3
|
||||
k8s.io/client-go v0.31.3
|
||||
github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b
|
||||
go.opentelemetry.io/contrib/bridges/otelslog v0.10.0
|
||||
go.opentelemetry.io/otel v1.37.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.13.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.35.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.36.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0
|
||||
go.opentelemetry.io/otel/metric v1.37.0
|
||||
go.opentelemetry.io/otel/sdk v1.37.0
|
||||
go.opentelemetry.io/otel/sdk/log v0.13.0
|
||||
go.opentelemetry.io/otel/sdk/metric v1.36.0
|
||||
go.opentelemetry.io/otel/trace v1.37.0
|
||||
golang.org/x/oauth2 v0.30.0
|
||||
golang.org/x/sync v0.16.0
|
||||
golang.org/x/text v0.27.0
|
||||
google.golang.org/api v0.243.0
|
||||
google.golang.org/genproto v0.0.0-20250603155806-513f23925822
|
||||
k8s.io/api v0.32.3
|
||||
k8s.io/apimachinery v0.32.3
|
||||
k8s.io/client-go v0.32.3
|
||||
sigs.k8s.io/wg-policy-prototypes v0.0.0-20240327135653-0fc2ddc5d3e3
|
||||
)
|
||||
|
||||
require (
|
||||
cel.dev/expr v0.16.1 // indirect
|
||||
cloud.google.com/go v0.116.0 // indirect
|
||||
cloud.google.com/go/auth v0.10.2 // indirect
|
||||
cloud.google.com/go/auth/oauth2adapt v0.2.5 // indirect
|
||||
cloud.google.com/go/compute/metadata v0.5.2 // indirect
|
||||
cloud.google.com/go/iam v1.2.2 // indirect
|
||||
cloud.google.com/go/longrunning v0.6.2 // indirect
|
||||
cloud.google.com/go/monitoring v1.21.2 // indirect
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0 // indirect
|
||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect
|
||||
github.com/Azure/go-amqp v1.0.5 // indirect
|
||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.1 // indirect
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 // indirect
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 // indirect
|
||||
cel.dev/expr v0.24.0 // indirect
|
||||
cloud.google.com/go v0.121.4 // indirect
|
||||
cloud.google.com/go/auth v0.16.3 // indirect
|
||||
cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect
|
||||
cloud.google.com/go/compute/metadata v0.7.0 // indirect
|
||||
cloud.google.com/go/iam v1.5.2 // indirect
|
||||
cloud.google.com/go/longrunning v0.6.7 // indirect
|
||||
cloud.google.com/go/monitoring v1.24.2 // indirect
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 // indirect
|
||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 // indirect
|
||||
github.com/Azure/go-amqp v1.4.0 // indirect
|
||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 // indirect
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 // indirect
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0 // indirect
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0 // indirect
|
||||
github.com/Microsoft/go-winio v0.6.2 // indirect
|
||||
github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 // indirect
|
||||
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b // indirect
|
||||
github.com/apache/arrow/go/arrow v0.0.0-20211112161151-bc219186db40 // indirect
|
||||
github.com/apache/thrift v0.20.0 // indirect
|
||||
github.com/apache/thrift v0.21.0 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.1 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.1 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.36 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.4 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.17 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/sso v1.17.2 // indirect
|
||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0 // indirect
|
||||
github.com/aws/smithy-go v1.22.5 // indirect
|
||||
github.com/benbjohnson/clock v1.3.5 // indirect
|
||||
github.com/beorn7/perks v1.0.1 // indirect
|
||||
github.com/caio/go-tdigest/v4 v4.0.1 // indirect
|
||||
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
|
||||
github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect
|
||||
github.com/cenkalti/backoff/v5 v5.0.2 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
||||
github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 // indirect
|
||||
github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 // indirect
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
||||
github.com/emicklei/go-restful/v3 v3.12.0 // indirect
|
||||
github.com/envoyproxy/go-control-plane v0.13.0 // indirect
|
||||
github.com/envoyproxy/protoc-gen-validate v1.1.0 // indirect
|
||||
github.com/emicklei/go-restful/v3 v3.12.1 // indirect
|
||||
github.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect
|
||||
github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect
|
||||
github.com/felixge/httpsnoop v1.0.4 // indirect
|
||||
github.com/fsnotify/fsnotify v1.7.0 // indirect
|
||||
github.com/fsnotify/fsnotify v1.8.0 // indirect
|
||||
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
|
||||
github.com/go-logr/logr v1.4.2 // indirect
|
||||
github.com/go-jose/go-jose/v4 v4.0.5 // indirect
|
||||
github.com/go-logr/logr v1.4.3 // indirect
|
||||
github.com/go-logr/stdr v1.2.2 // indirect
|
||||
github.com/go-openapi/jsonpointer v0.21.0 // indirect
|
||||
github.com/go-openapi/jsonreference v0.21.0 // indirect
|
||||
github.com/go-openapi/swag v0.23.0 // indirect
|
||||
github.com/gogo/protobuf v1.3.2 // indirect
|
||||
github.com/golang-jwt/jwt/v5 v5.2.1 // indirect
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||
github.com/golang-jwt/jwt/v5 v5.2.2 // indirect
|
||||
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
|
||||
github.com/golang/protobuf v1.5.4 // indirect
|
||||
github.com/golang/snappy v0.0.4 // indirect
|
||||
github.com/google/gnostic-models v0.6.8 // indirect
|
||||
github.com/google/gnostic-models v0.6.9 // indirect
|
||||
github.com/google/go-querystring v1.1.0 // indirect
|
||||
github.com/google/gofuzz v1.2.0 // indirect
|
||||
github.com/google/s2a-go v0.1.8 // indirect
|
||||
github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect
|
||||
github.com/google/s2a-go v0.1.9 // indirect
|
||||
github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect
|
||||
github.com/gorilla/websocket v1.5.3 // indirect
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 // indirect
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // indirect
|
||||
github.com/hashicorp/hcl v1.0.0 // indirect
|
||||
github.com/imdario/mergo v1.0.0 // indirect
|
||||
github.com/jackc/pgpassfile v1.0.0 // indirect
|
||||
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
|
||||
github.com/jackc/puddle/v2 v2.2.2 // indirect
|
||||
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
||||
github.com/josharian/intern v1.0.0 // indirect
|
||||
github.com/json-iterator/go v1.1.12 // indirect
|
||||
github.com/klauspost/compress v1.17.9 // indirect
|
||||
github.com/klauspost/compress v1.18.0 // indirect
|
||||
github.com/kylelemons/godebug v1.1.0 // indirect
|
||||
github.com/magiconair/properties v1.8.7 // indirect
|
||||
github.com/mailru/easyjson v0.7.7 // indirect
|
||||
github.com/magiconair/properties v1.8.9 // indirect
|
||||
github.com/mailru/easyjson v0.9.0 // indirect
|
||||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
||||
github.com/modern-go/reflect2 v1.0.2 // indirect
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||
github.com/nats-io/nats-server/v2 v2.9.23 // indirect
|
||||
github.com/nats-io/nats-server/v2 v2.10.27 // indirect
|
||||
github.com/nats-io/nats-streaming-server v0.24.6 // indirect
|
||||
github.com/nats-io/nkeys v0.4.7 // indirect
|
||||
github.com/nats-io/nkeys v0.4.10 // indirect
|
||||
github.com/nats-io/nuid v1.0.1 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
|
||||
github.com/pierrec/lz4/v4 v4.1.21 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
|
||||
github.com/pierrec/lz4/v4 v4.1.22 // indirect
|
||||
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||
github.com/prometheus/client_model v0.6.1 // indirect
|
||||
github.com/prometheus/common v0.55.0 // indirect
|
||||
github.com/prometheus/common v0.62.0 // indirect
|
||||
github.com/prometheus/procfs v0.15.1 // indirect
|
||||
github.com/sagikazarmark/locafero v0.4.0 // indirect
|
||||
github.com/sagikazarmark/locafero v0.7.0 // indirect
|
||||
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
|
||||
github.com/sourcegraph/conc v0.3.0 // indirect
|
||||
github.com/spf13/afero v1.11.0 // indirect
|
||||
github.com/spf13/cast v1.6.0 // indirect
|
||||
github.com/spf13/pflag v1.0.5 // indirect
|
||||
github.com/spf13/afero v1.12.0 // indirect
|
||||
github.com/spf13/cast v1.7.1 // indirect
|
||||
github.com/spf13/pflag v1.0.6 // indirect
|
||||
github.com/spiffe/go-spiffe/v2 v2.5.0 // indirect
|
||||
github.com/subosito/gotenv v1.6.0 // indirect
|
||||
github.com/telkomdev/go-stash v1.0.6
|
||||
github.com/x448/float16 v0.8.4 // indirect
|
||||
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
|
||||
github.com/xdg-go/scram v1.1.2 // indirect
|
||||
github.com/xdg-go/stringprep v1.0.4 // indirect
|
||||
github.com/xhit/go-str2duration/v2 v2.1.0 // indirect
|
||||
github.com/zeebo/errs v1.4.0 // indirect
|
||||
go.opencensus.io v0.24.0 // indirect
|
||||
go.opentelemetry.io/contrib/detectors/gcp v1.29.0 // indirect
|
||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 // indirect
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect
|
||||
go.opentelemetry.io/proto/otlp v1.3.1 // indirect
|
||||
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
|
||||
go.opentelemetry.io/contrib/detectors/gcp v1.36.0 // indirect
|
||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect
|
||||
go.opentelemetry.io/otel/log v0.13.0 // indirect
|
||||
go.opentelemetry.io/proto/otlp v1.7.0 // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
go.uber.org/zap v1.27.0 // indirect
|
||||
golang.org/x/crypto v0.29.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f // indirect
|
||||
golang.org/x/net v0.31.0 // indirect
|
||||
golang.org/x/sys v0.27.0 // indirect
|
||||
golang.org/x/term v0.26.0 // indirect
|
||||
golang.org/x/time v0.8.0 // indirect
|
||||
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20241113202542-65e8d215514f // indirect
|
||||
google.golang.org/grpc v1.67.1 // indirect
|
||||
google.golang.org/grpc/stats/opentelemetry v0.0.0-20240907200651-3ffb98b2c93a // indirect
|
||||
google.golang.org/protobuf v1.35.2 // indirect
|
||||
golang.org/x/crypto v0.40.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c // indirect
|
||||
golang.org/x/net v0.42.0 // indirect
|
||||
golang.org/x/sys v0.34.0 // indirect
|
||||
golang.org/x/term v0.33.0 // indirect
|
||||
golang.org/x/time v0.12.0 // indirect
|
||||
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20250721164621-a45f3dfb1074 // indirect
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250721164621-a45f3dfb1074 // indirect
|
||||
google.golang.org/grpc v1.74.2 // indirect
|
||||
google.golang.org/protobuf v1.36.6 // indirect
|
||||
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
|
||||
gopkg.in/inf.v0 v0.9.1 // indirect
|
||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
k8s.io/klog/v2 v2.130.1 // indirect
|
||||
k8s.io/kube-openapi v0.0.0-20240423202451-8948a665c108 // indirect
|
||||
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect
|
||||
sigs.k8s.io/controller-runtime v0.17.3 // indirect
|
||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
|
||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
|
||||
k8s.io/kube-openapi v0.0.0-20241212222426-2c72e554b1e7 // indirect
|
||||
k8s.io/utils v0.0.0-20241210054802-24370beab758 // indirect
|
||||
sigs.k8s.io/controller-runtime v0.20.1 // indirect
|
||||
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
|
||||
sigs.k8s.io/structured-merge-diff/v4 v4.5.0 // indirect
|
||||
sigs.k8s.io/yaml v1.4.0 // indirect
|
||||
)
|
||||
|
||||
|
|
522
go.sum
522
go.sum
|
@ -1,5 +1,5 @@
|
|||
cel.dev/expr v0.16.1 h1:NR0+oFYzR1CqLFhTAqg3ql59G9VfN8fKq1TCHJ6gq1g=
|
||||
cel.dev/expr v0.16.1/go.mod h1:AsGA5zb3WruAEQeQng1RZdGEXmBj0jvMWh6l5SnNuC8=
|
||||
cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY=
|
||||
cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=
|
||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
|
||||
|
@ -32,12 +32,12 @@ cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Ud
|
|||
cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA=
|
||||
cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U=
|
||||
cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A=
|
||||
cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE=
|
||||
cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U=
|
||||
cloud.google.com/go/auth v0.10.2 h1:oKF7rgBfSHdp/kuhXtqU/tNDr0mZqhYbEh+6SiqzkKo=
|
||||
cloud.google.com/go/auth v0.10.2/go.mod h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI=
|
||||
cloud.google.com/go/auth/oauth2adapt v0.2.5 h1:2p29+dePqsCHPP1bqDJcKj4qxRyYCcbzKpFyKGt3MTk=
|
||||
cloud.google.com/go/auth/oauth2adapt v0.2.5/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8=
|
||||
cloud.google.com/go v0.121.4 h1:cVvUiY0sX0xwyxPwdSU2KsF9knOVmtRyAMt8xou0iTs=
|
||||
cloud.google.com/go v0.121.4/go.mod h1:XEBchUiHFJbz4lKBZwYBDHV/rSyfFktk737TLDU089s=
|
||||
cloud.google.com/go/auth v0.16.3 h1:kabzoQ9/bobUmnseYnBO6qQG7q4a/CffFRlJSxv2wCc=
|
||||
cloud.google.com/go/auth v0.16.3/go.mod h1:NucRGjaXfzP1ltpcQ7On/VTZ0H4kWB5Jy+Y9Dnm76fA=
|
||||
cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc=
|
||||
cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c=
|
||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
||||
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
||||
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
||||
|
@ -48,37 +48,37 @@ cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTB
|
|||
cloud.google.com/go/compute v1.2.0/go.mod h1:xlogom/6gr8RJGBe7nT2eGsQYAFUbbv8dbC29qE3Xmw=
|
||||
cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM=
|
||||
cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M=
|
||||
cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo=
|
||||
cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k=
|
||||
cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU=
|
||||
cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo=
|
||||
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
||||
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
|
||||
cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY=
|
||||
cloud.google.com/go/functions v1.19.2 h1:Cu2Gj1JBBJv9gi89r8LrZNsJhGwePnhttn4Blqw/EYI=
|
||||
cloud.google.com/go/functions v1.19.2/go.mod h1:SBzWwWuaFDLnUyStDAMEysVN1oA5ECLbP3/PfJ9Uk7Y=
|
||||
cloud.google.com/go/functions v1.19.6 h1:vJgWlvxtJG6p/JrbXAkz83DbgwOyFhZZI1Y32vUddjY=
|
||||
cloud.google.com/go/functions v1.19.6/go.mod h1:0G0RnIlbM4MJEycfbPZlCzSf2lPOjL7toLDwl+r0ZBw=
|
||||
cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c=
|
||||
cloud.google.com/go/iam v0.1.1/go.mod h1:CKqrcnI/suGpybEHxZ7BMehL0oA4LpdyJdUlTl9jVMw=
|
||||
cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY=
|
||||
cloud.google.com/go/iam v1.2.2 h1:ozUSofHUGf/F4tCNy/mu9tHLTaxZFLOUiKzjcgWHGIA=
|
||||
cloud.google.com/go/iam v1.2.2/go.mod h1:0Ys8ccaZHdI1dEUilwzqng/6ps2YB6vRsjIe00/+6JY=
|
||||
cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8=
|
||||
cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE=
|
||||
cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI=
|
||||
cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA=
|
||||
cloud.google.com/go/kms v1.20.1 h1:og29Wv59uf2FVaZlesaiDAqHFzHaoUyHI3HYp9VUHVg=
|
||||
cloud.google.com/go/kms v1.20.1/go.mod h1:LywpNiVCvzYNJWS9JUcGJSVTNSwPwi0vBAotzDqn2nc=
|
||||
cloud.google.com/go/logging v1.12.0 h1:ex1igYcGFd4S/RZWOCU51StlIEuey5bjqwH9ZYjHibk=
|
||||
cloud.google.com/go/logging v1.12.0/go.mod h1:wwYBt5HlYP1InnrtYI0wtwttpVU1rifnMT7RejksUAM=
|
||||
cloud.google.com/go/longrunning v0.6.2 h1:xjDfh1pQcWPEvnfjZmwjKQEcHnpz6lHjfy7Fo0MK+hc=
|
||||
cloud.google.com/go/longrunning v0.6.2/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI=
|
||||
cloud.google.com/go/kms v1.22.0 h1:dBRIj7+GDeeEvatJeTB19oYZNV0aj6wEqSIT/7gLqtk=
|
||||
cloud.google.com/go/kms v1.22.0/go.mod h1:U7mf8Sva5jpOb4bxYZdtw/9zsbIjrklYwPcvMk34AL8=
|
||||
cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc=
|
||||
cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA=
|
||||
cloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFsS/PrE=
|
||||
cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY=
|
||||
cloud.google.com/go/monitoring v1.1.0/go.mod h1:L81pzz7HKn14QCMaCs6NTQkdBnE87TElyanS95vIcl4=
|
||||
cloud.google.com/go/monitoring v1.4.0/go.mod h1:y6xnxfwI3hTFWOdkOaD7nfJVlwuC3/mS/5kvtT131p4=
|
||||
cloud.google.com/go/monitoring v1.21.2 h1:FChwVtClH19E7pJ+e0xUhJPGksctZNVOk2UhMmblmdU=
|
||||
cloud.google.com/go/monitoring v1.21.2/go.mod h1:hS3pXvaG8KgWTSz+dAdyzPrGUYmi2Q+WFX8g2hqVEZU=
|
||||
cloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM=
|
||||
cloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U=
|
||||
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
||||
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
|
||||
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
|
||||
cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
|
||||
cloud.google.com/go/pubsub v1.19.0/go.mod h1:/O9kmSe9bb9KRnIAWkzmqhPjHo6LtzGOBYd/kr06XSs=
|
||||
cloud.google.com/go/pubsub v1.45.1 h1:ZC/UzYcrmK12THWn1P72z+Pnp2vu/zCZRXyhAfP1hJY=
|
||||
cloud.google.com/go/pubsub v1.45.1/go.mod h1:3bn7fTmzZFwaUjllitv1WlsNMkqBgGUb3UdMhI54eCc=
|
||||
cloud.google.com/go/pubsub v1.49.0 h1:5054IkbslnrMCgA2MAEPcsN3Ky+AyMpEZcii/DoySPo=
|
||||
cloud.google.com/go/pubsub v1.49.0/go.mod h1:K1FswTWP+C1tI/nfi3HQecoVeFvL4HUOB1tdaNXKhUY=
|
||||
cloud.google.com/go/secretmanager v1.3.0/go.mod h1:+oLTkouyiYiabAQNugCeTS3PAArGiMJuBqvJnJsyH+U=
|
||||
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
|
||||
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
|
||||
|
@ -87,17 +87,15 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX
|
|||
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
|
||||
cloud.google.com/go/storage v1.12.0/go.mod h1:fFLk2dp2oAhDz8QFKwqrjdJvxSp/W2g7nillojlL5Ho=
|
||||
cloud.google.com/go/storage v1.21.0/go.mod h1:XmRlxkgPjlBONznT2dDUU/5XlpU2OjMnKuqnZI01LAA=
|
||||
cloud.google.com/go/storage v1.47.0 h1:ajqgt30fnOMmLfWfu1PWcb+V9Dxz6n+9WKjdNg5R4HM=
|
||||
cloud.google.com/go/storage v1.47.0/go.mod h1:Ks0vP374w0PW6jOUameJbapbQKXqkjGd/OJRp2fb9IQ=
|
||||
cloud.google.com/go/storage v1.56.0 h1:iixmq2Fse2tqxMbWhLWC9HfBj1qdxqAmiK8/eqtsLxI=
|
||||
cloud.google.com/go/storage v1.56.0/go.mod h1:Tpuj6t4NweCLzlNbw9Z9iwxEkrSem20AetIeH/shgVU=
|
||||
cloud.google.com/go/trace v1.0.0/go.mod h1:4iErSByzxkyHWzzlAj63/Gmjz0NH1ASqhJguHpGcr6A=
|
||||
cloud.google.com/go/trace v1.2.0/go.mod h1:Wc8y/uYyOhPy12KEnXG9XGrvfMz5F5SrYecQlbW1rwM=
|
||||
cloud.google.com/go/trace v1.11.2 h1:4ZmaBdL8Ng/ajrgKqY5jfvzqMXbrDcBsUGXOT9aqTtI=
|
||||
cloud.google.com/go/trace v1.11.2/go.mod h1:bn7OwXd4pd5rFuAnTrzBuoZ4ax2XQeG3qNgYmfCy0Io=
|
||||
cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4=
|
||||
cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI=
|
||||
contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA=
|
||||
contrib.go.opencensus.io/exporter/stackdriver v0.13.10/go.mod h1:I5htMbyta491eUxufwwZPQdcKvvgzMB4O9ni41YnIM8=
|
||||
contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE=
|
||||
dario.cat/mergo v0.3.16 h1:wrt7QIfeqlABnUvmf9WpFwB0mGBwtySAJKTgCpnsbOE=
|
||||
dario.cat/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
|
||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||
gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=
|
||||
github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI=
|
||||
|
@ -109,36 +107,36 @@ github.com/Azure/azure-sdk-for-go v59.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9mo
|
|||
github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0/go.mod h1:h6H6c8enJmmocHUbLiiGY6sx7f9i+X3m1CHdd5c6Rdw=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0 h1:nyQWyZvwGTvunIMxi1Y9uXkcyr+I7TeNrr/foo4Kpk8=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.14.0/go.mod h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 h1:Gt0j3wceWMwPmiazCa8MzMA0MfhmPIz0Qp0FJ6qcM0U=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0/go.mod h1:Ot/6aikWnKWi4l9QB7qVSwa8iMphQNqkWALMoNT3rzM=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.11.0/go.mod h1:HcM1YX14R7CJcghJGOYCgdezslRSVzqwLf/q+4Y2r/0=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.0.0/go.mod h1:+6sju8gk8FRmSajX3Oz4G5Gm7P+mbqE9FVaXXFYTkCM=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0 h1:B/dfvscEQtew9dVuoxqxrUKKv8Ih2f55PydknDamU+g=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0/go.mod h1:fiPSssYvltE08HJchL04dOy+RD4hgrjph0cwGGMntdI=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.0 h1:+m0M/LFxN43KvULkDNfdXOgrjtg6UYJPFBJyuEcRCAw=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.0/go.mod h1:PwOyop78lveYMRs6oCxjiVyBdyCgIYH6XHIVZO9/SFQ=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1 h1:B+blDbyVIG3WaikNxPnhPiJ1MThR03b3vKGtER95TP4=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1/go.mod h1:JdM5psgjfBf5fo2uWOZhflPWyDBZ/O/CNAH9CtsuZE4=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0/go.mod h1:yqy467j36fJxcRV2TzfVZ1pCb5vxm4BtZPUdYWe/Xo8=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs v1.2.3 h1:6bVZts/82H+hax9b3vdmSpi7+Hw9uWvEaJHeKlafnW4=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs v1.2.3/go.mod h1:qf3s/6aV9ePKYGeEYPsbndK6GGfeS7SrbA6OE/T7NIA=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/eventhub/armeventhub v1.2.0 h1:+dggnR89/BIIlRlQ6d19dkhhdd/mQUiQbXhyHUFiB4w=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/eventhub/armeventhub v1.2.0/go.mod h1:tI9M2Q/ueFi287QRkdrhb9LHm6ZnXgkVYLRC3FhYkPw=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 h1:FPKJS1T+clwv+OLGt13a8UjqeRuh0O4SJ3lUriThc+4=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1/go.mod h1:j2chePtV91HrC22tGoRX3sGY42uF13WzmmV80/OdVAA=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs v1.3.2 h1:Hr35UBihxDesuh4JDMu/PcgAyIEmvoUl1IPfQnrK0YI=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs v1.3.2/go.mod h1:PNuUXQzL07VmB7IR63Qkh0htSOBzmuYYmu2cWVneFDY=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/eventhub/armeventhub v1.3.0 h1:4hGvxD72TluuFIXVr8f4XkKZfqAa7Pj61t0jmQ7+kes=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/eventhub/armeventhub v1.3.0/go.mod h1:TSH7DcFItwAufy0Lz+Ft2cyopExCpxbOxI5SkH4dRNo=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.0.0/go.mod h1:ceIuwmxDWptoW3eCqSXlnPsZFKh4X+R38dWPv7GS9Vs=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0/go.mod h1:s1tW/At+xHqjNFvWU4G0c0Qv33KOhvbGNj0RCTQDV8s=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2 h1:YUUxeiOWgdAQE3pXt2H7QXzZs0q8UBjgRbl56qo8GYM=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2/go.mod h1:dmXQgZuiSubAecswZE+Sm8jkvEa7kQgTPVRvwL/nd0E=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0 h1:UXT0o77lXQrikd1kgwIPQOUect7EoR/+sbP4wQKdzxM=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.0/go.mod h1:cTvi54pg19DoT07ekoeMgE/taAwNtCShVeZqA+Iv2xI=
|
||||
github.com/Azure/azure-service-bus-go v0.11.5/go.mod h1:MI6ge2CuQWBVq+ly456MY7XqNLJip5LO1iSFodbNLbU=
|
||||
github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck=
|
||||
github.com/Azure/go-amqp v0.16.0/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg=
|
||||
github.com/Azure/go-amqp v0.16.4/go.mod h1:9YJ3RhxRT1gquYnzpZO1vcYMMpAdJT+QEg6fwmw9Zlg=
|
||||
github.com/Azure/go-amqp v1.0.5 h1:po5+ljlcNSU8xtapHTe8gIc8yHxCzC03E8afH2g1ftU=
|
||||
github.com/Azure/go-amqp v1.0.5/go.mod h1:vZAogwdrkbyK3Mla8m/CxSc/aKdnTZ4IbPxl51Y5WZE=
|
||||
github.com/Azure/go-amqp v1.4.0 h1:Xj3caqi4comOF/L1Uc5iuBxR/pB6KumejC01YQOqOR4=
|
||||
github.com/Azure/go-amqp v1.4.0/go.mod h1:vZAogwdrkbyK3Mla8m/CxSc/aKdnTZ4IbPxl51Y5WZE=
|
||||
github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
|
||||
github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA=
|
||||
github.com/Azure/go-autorest/autorest v0.11.19/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA=
|
||||
|
@ -159,22 +157,22 @@ github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJ
|
|||
github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE=
|
||||
github.com/AzureAD/microsoft-authentication-library-for-go v0.4.0/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4=
|
||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o=
|
||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU=
|
||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
|
||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 h1:oygO0locgZJe7PpYPXT5A29ZkwJaPqcva7BVeemZOZs=
|
||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||
github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
||||
github.com/DataDog/datadog-go v4.8.3+incompatible h1:fNGaYSuObuQb5nzeTQqowRAd9bpDIRRV4/gUtIBjh8Q=
|
||||
github.com/DataDog/datadog-go v4.8.3+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
|
||||
github.com/GoogleCloudPlatform/cloudsql-proxy v1.29.0/go.mod h1:spvB9eLJH9dutlbPSRmHvSXXHOwGRyeXh1jVdquA2G8=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.1 h1:pB2F2JKCj1Znmp2rwxxt1J0Fg0wezTMgWYk5Mpbi1kg=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.24.1/go.mod h1:itPGVDKf9cC/ov4MdvJ2QZ0khw4bfoo9jzwTJlaxy2k=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1 h1:UQ0AhxogsIRZDkElkblfnwjc3IaltCm2HUMvezQaL7s=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1/go.mod h1:jyqM3eLpJ3IbIFDTKVz2rF9T/xWGW0rIriGwnz8l9Tk=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.1 h1:oTX4vsorBZo/Zdum6OKPA4o7544hm6smoRv1QjpTwGo=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.48.1/go.mod h1:0wEl7vrAD8mehJyohS9HZy+WyEOaQO2mJx86Cvh93kM=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1 h1:8nn+rsCvTq9axyEh382S0PFLBeaFwNsT43IrPWzctRU=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1/go.mod h1:viRWSEhtMZqz1rhwmOVKkWl6SwmVowfL9O2YR5gI2PE=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 h1:ErKg/3iS1AKcTkf3yixlZ54f9U1rljCkQyEXWUnIUxc=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0/go.mod h1:yAZHSGnqScoU556rBOVkwLze6WP5N+U11RHuWaGVxwY=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0 h1:owcC2UnmsZycprQ5RfRgjydWhuoxg71LUfyiQdijZuM=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0/go.mod h1:ZPpqegjbE99EPKsu3iUWV22A04wzGPcAY/ziSIQEEgs=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.53.0 h1:4LP6hvB4I5ouTbGgWtixJhgED6xdf67twf9PoY96Tbg=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.53.0/go.mod h1:jUZ5LYlw40WMd07qxcQJD5M40aUxrfwqQX1g7zxYnrQ=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0 h1:Ron4zCA/yk6U7WOBXhTJcDpsUBG9npumK6xw2auFltQ=
|
||||
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0/go.mod h1:cSgYe11MCNYunTnRXrKiR/tHc0eoKjICUuWpNZoVCOo=
|
||||
github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
|
||||
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
|
||||
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
|
||||
|
@ -184,16 +182,16 @@ github.com/PagerDuty/go-pagerduty v1.8.0/go.mod h1:nzIeAqyFSJAFkjWKvMzug0JtwDg+V
|
|||
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
|
||||
github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY=
|
||||
github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE=
|
||||
github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 h1:ez/4by2iGztzR4L0zgAOR8lTQK9VlyBVVd7G4omaOQs=
|
||||
github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE=
|
||||
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vSQ6PWWSL9lK8qwHozUj03+zLoEB8O0=
|
||||
github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs=
|
||||
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
||||
github.com/apache/arrow/go/arrow v0.0.0-20200730104253-651201b0f516/go.mod h1:QNYViu/X0HXDHw7m3KXzWSVXIbfUvJqBFe6Gj8/pYA0=
|
||||
github.com/apache/arrow/go/arrow v0.0.0-20211112161151-bc219186db40 h1:q4dksr6ICHXqG5hm0ZW5IHyeEJXoIJSOZeBLmWPNeIQ=
|
||||
github.com/apache/arrow/go/arrow v0.0.0-20211112161151-bc219186db40/go.mod h1:Q7yQnSMnLvcXlZ8RV+jwz/6y1rQTqbX6C82SndT52Zs=
|
||||
github.com/apache/thrift v0.0.0-20181112125854-24918abba929/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
|
||||
github.com/apache/thrift v0.14.2/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
|
||||
github.com/apache/thrift v0.20.0 h1:631+KvYbsBZxmuJjYwhezVsrfc/TbqtZV4QcxOX1fOI=
|
||||
github.com/apache/thrift v0.20.0/go.mod h1:hOk1BQqcp2OLzGsyVXdfMk7YFlMxK3aoEVhjD06QhB8=
|
||||
github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE=
|
||||
github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw=
|
||||
github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg=
|
||||
github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=
|
||||
github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=
|
||||
|
@ -201,49 +199,85 @@ github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZo
|
|||
github.com/aws/aws-sdk-go v1.30.19/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0=
|
||||
github.com/aws/aws-sdk-go v1.37.0/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
|
||||
github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
|
||||
github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=
|
||||
github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
|
||||
github.com/aws/aws-sdk-go-v2 v1.16.2/go.mod h1:ytwTPBG6fXTZLxxeeCCWj2/EMYp/xDUgX+OET6TLNNU=
|
||||
github.com/aws/aws-sdk-go-v2 v1.23.0/go.mod h1:i1XDttT4rnf6vxc9AuskLc6s7XBee8rlLilKlc03uAA=
|
||||
github.com/aws/aws-sdk-go-v2 v1.37.1 h1:SMUxeNz3Z6nqGsXv0JuJXc8w5YMtrQMuIBmDx//bBDY=
|
||||
github.com/aws/aws-sdk-go-v2 v1.37.1/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg=
|
||||
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.1/go.mod h1:n8Bs1ElDD2wJ9kCRTczA83gYbBmjSwZp3umc6zF4EeM=
|
||||
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.5.1/go.mod h1:t8PYl/6LzdAqsU4/9tz28V/kU+asFePvpOMkdul0gEQ=
|
||||
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0 h1:6GMWV6CNpA/6fbFHnoAjrv4+LGfyTqZz2LtCHnspgDg=
|
||||
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.0/go.mod h1:/mXlTIVG9jbxkqDnr5UQNQxW1HRYxeGklkM9vAFeabg=
|
||||
github.com/aws/aws-sdk-go-v2/config v1.15.3/go.mod h1:9YL3v07Xc/ohTsxFXzan9ZpFpdTOFl4X65BAKYaz8jg=
|
||||
github.com/aws/aws-sdk-go-v2/config v1.25.3 h1:E4m9LbwJOoncDNt3e9MPLbz/saxWcGUlZVBydydD6+8=
|
||||
github.com/aws/aws-sdk-go-v2/config v1.25.3/go.mod h1:tAByZy03nH5jcq0vZmkcVoo6tRzRHEwSFx3QW4NmDw8=
|
||||
github.com/aws/aws-sdk-go-v2/credentials v1.11.2/go.mod h1:j8YsY9TXTm31k4eFhspiQicfXPLZ0gYXA50i4gxPE8g=
|
||||
github.com/aws/aws-sdk-go-v2/credentials v1.16.2 h1:0sdZ5cwfOAipTzZ7eOL0gw4LAhk/RZnTa16cDqIt8tg=
|
||||
github.com/aws/aws-sdk-go-v2/credentials v1.16.2/go.mod h1:sDdvGhXrSVT5yzBDR7qXz+rhbpiMpUYfF3vJ01QSdrc=
|
||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.3/go.mod h1:uk1vhHHERfSVCUnqSqz8O48LBYDSC+k6brng09jcMOk=
|
||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4 h1:9wKDWEjwSnXZre0/O3+ZwbBl1SmlgWYBbrTV10X/H1s=
|
||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.4/go.mod h1:t4i+yGHMCcUNIX1x7YVYa6bH/Do7civ5I6cG/6PMfyA=
|
||||
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.3/go.mod h1:0dHuD2HZZSiwfJSy1FO5bX1hQ1TxVV1QXXjpn3XUE44=
|
||||
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.14.0/go.mod h1:UcgIwJ9KHquYxs6Q5skC9qXjhYMK+JASDYcXQ4X7JZE=
|
||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.9/go.mod h1:AnVH5pvai0pAF4lXRq0bmhbes1u9R8wTE+g+183bZNM=
|
||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.3/go.mod h1:7sGSz1JCKHWWBHq98m6sMtWQikmYPpxjqOydDemiVoM=
|
||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.1 h1:ksZXBYv80EFTcgc8OJO48aQ8XDWXIQL7gGasPeCoTzI=
|
||||
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.1/go.mod h1:HSksQyyJETVZS7uM54cir0IgxttTD+8aEoJMPGepHBI=
|
||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.3/go.mod h1:ssOhaLpRlh88H3UmEcsBoVKq309quMvm3Ds8e9d4eJM=
|
||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.3/go.mod h1:ify42Rb7nKeDDPkFjKn7q1bPscVPu/+gmHH8d2c+anU=
|
||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.1 h1:+dn/xF/05utS7tUhjIcndbuaPjfll2LhbH1cCDGLYUQ=
|
||||
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.1/go.mod h1:hyAGz30LHdm5KBZDI58MXx5lDVZ5CUfvfTZvMu4HCZo=
|
||||
github.com/aws/aws-sdk-go-v2/internal/ini v1.3.10/go.mod h1:8DcYQcz0+ZJaSxANlHIsbbi6S+zMwjwdDqwW3r9AzaE=
|
||||
github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1 h1:uR9lXYjdPX0xY+NhvaJ4dD8rpSRz5VY81ccIIoNG+lw=
|
||||
github.com/aws/aws-sdk-go-v2/internal/ini v1.7.1/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY=
|
||||
github.com/aws/aws-sdk-go-v2/internal/v4a v1.2.3/go.mod h1:5yzAuE9i2RkVAttBl8yxZgQr5OCq4D5yDnG7j9x2L0U=
|
||||
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.36 h1:GMYy2EOWfzdP3wfVAGXBNKY5vK4K8vMET4sYOYltmqs=
|
||||
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.36/go.mod h1:gDhdAV6wL3PmPqBhiPbnlS447GoWs8HTTOYef9/9Inw=
|
||||
github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.47.3 h1:3y0jkGtsaZLCg+n73BoSXOAkLFtgmD/+4prXW1pzovc=
|
||||
github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.47.3/go.mod h1:uo14VBn5cNk/BPGTPz3kyLBxgpgOObgO8lmz+H7Z4Ck=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.1/go.mod h1:GeUru+8VzrTXV/83XyMJ80KpH8xO89VPoUileyNQ+tc=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.1/go.mod h1:l9ymW25HOqymeU2m1gbUQ3rUIsTwKs8gYHXkqDQUhiI=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 h1:CXV68E2dNqhuynZJPB80bhPQwAKqBWVer887figW6Jc=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4/go.mod h1:/xFi9KtvBXP97ppCz1TAEvU1Uf66qvid89rbem3wCzQ=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.3/go.mod h1:Seb8KNmD6kVTjwRjVEgOT5hPin6sq+v4C2ycJQDwuH8=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.2.3/go.mod h1:R+/S1O4TYpcktbVwddeOYg+uwUfLhADP2S/x4QwsCTM=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.4 h1:nAP2GYbfh8dd2zGZqFRSMlq+/F6cMPBUuCsGAMkN074=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.4/go.mod h1:LT10DsiGjLWh4GbjInf9LQejkYEhBgBCjLG5+lvk4EE=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.3/go.mod h1:wlY6SVjuwvh3TVRpTqdy4I1JpBFLX4UGeKZdWntaocw=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.3/go.mod h1:Owv1I59vaghv1Ax8zz8ELY8DN7/Y0rGS+WWAmjgi950=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17 h1:t0E6FzREdtCsiLIoLCWsYliNsRBgyGD/MCK571qk4MI=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17/go.mod h1:ygpklyoaypuyDvOM5ujWGrYWpAK3h7ugnmKCU/76Ys4=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.3/go.mod h1:Bm/v2IaN6rZ+Op7zX+bOUMdL4fsrYZiD0dsjLhNKwZc=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.16.3/go.mod h1:KZgs2ny8HsxRIRbDwgvJcHHBZPOzQr/+NtGwnP+w2ec=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.17 h1:qcLWgdhq45sDM9na4cvXax9dyLitn8EYBRl8Ak4XtG4=
|
||||
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.17/go.mod h1:M+jkjBFZ2J6DJrjMv2+vkBbuht6kxJYtJiwoVgX4p4U=
|
||||
github.com/aws/aws-sdk-go-v2/service/kinesis v1.35.4 h1:/yAOGVYVbP7JUzq8O3EU0jwkq1S1rI/cy0tWw7aMgyE=
|
||||
github.com/aws/aws-sdk-go-v2/service/kinesis v1.35.4/go.mod h1:c8D+j9MdFK4uWO/AUKFjq3qUVcuHDv4j+VQIyKgsa3M=
|
||||
github.com/aws/aws-sdk-go-v2/service/kms v1.16.3/go.mod h1:QuiHPBqlOFCi4LqdSskYYAWpQlx3PKmohy+rE2F+o5g=
|
||||
github.com/aws/aws-sdk-go-v2/service/lambda v1.74.1 h1:UOf0eSkWmna/6lR+tOwJYJaTSJsA/WFYm86nE2VPklY=
|
||||
github.com/aws/aws-sdk-go-v2/service/lambda v1.74.1/go.mod h1:6wi1Ji6Z2WhSfVVrFj40GbWCX+cjaCEaTuCXnAVFytM=
|
||||
github.com/aws/aws-sdk-go-v2/service/s3 v1.26.3/go.mod h1:g1qvDuRsJY+XghsV6zg00Z4KJ7DtFFCx8fJD2a491Ak=
|
||||
github.com/aws/aws-sdk-go-v2/service/s3 v1.43.0/go.mod h1:NXRKkiRF+erX2hnybnVU660cYT5/KChRD4iUgJ97cI8=
|
||||
github.com/aws/aws-sdk-go-v2/service/s3 v1.83.0 h1:5Y75q0RPQoAbieyOuGLhjV9P3txvYgXv2lg0UwJOfmE=
|
||||
github.com/aws/aws-sdk-go-v2/service/s3 v1.83.0/go.mod h1:kUklwasNoCn5YpyAqC/97r6dzTA1SRKJfKq16SXeoDU=
|
||||
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4/go.mod h1:PJc8s+lxyU8rrre0/4a0pn2wgwiDvOEzoOjcJUBr67o=
|
||||
github.com/aws/aws-sdk-go-v2/service/sns v1.17.4 h1:7TdmoJJBwLFyakXjfrGztejwY5Ie1JEto7YFfznCmAw=
|
||||
github.com/aws/aws-sdk-go-v2/service/sns v1.17.4/go.mod h1:kElt+uCcXxcqFyc+bQqZPFD9DME/eC6oHBXvFzQ9Bcw=
|
||||
github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3 h1:uHjK81fESbGy2Y9lspub1+C6VN5W2UXTDo2A/Pm4G0U=
|
||||
github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3/go.mod h1:skmQo0UPvsjsuYYSYMVmrPc1HWCbHUJyrCEp+ZaLzqM=
|
||||
github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1/go.mod h1:NR/xoKjdbRJ+qx0pMR4mI+N/H1I1ynHwXnO6FowXJc0=
|
||||
github.com/aws/aws-sdk-go-v2/service/sso v1.11.3/go.mod h1:7UQ/e69kU7LDPtY40OyoHYgRmgfGM4mgsLYtcObdveU=
|
||||
github.com/aws/aws-sdk-go-v2/service/sso v1.17.2 h1:V47N5eKgVZoRSvx2+RQ0EpAEit/pqOhqeSQFiS4OFEQ=
|
||||
github.com/aws/aws-sdk-go-v2/service/sso v1.17.2/go.mod h1:/pE21vno3q1h4bbhUOEi+6Zu/aT26UK2WKkDXd+TssQ=
|
||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0 h1:/XiEU7VIFcVWRDQLabyrSjBoKIm8UkYgsvWDuFW8Img=
|
||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.20.0/go.mod h1:dWqm5G767qwKPuayKfzm4rjzFmVjiBFbOJrpSPnAMDs=
|
||||
github.com/aws/aws-sdk-go-v2/service/sts v1.16.3/go.mod h1:bfBj0iVmsUyUg4weDB4NxktD9rDGeKSVWnjTnwbx9b8=
|
||||
github.com/aws/aws-sdk-go-v2/service/sts v1.25.3/go.mod h1:4EqRHDCKP78hq3zOnmFXu5k0j4bXbRFfCh/zQ6KnEfQ=
|
||||
github.com/aws/aws-sdk-go-v2/service/sts v1.33.19 h1:1XuUZ8mYJw9B6lzAkXhqHlJd/XvaX32evhproijJEZY=
|
||||
github.com/aws/aws-sdk-go-v2/service/sts v1.33.19/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4=
|
||||
github.com/aws/smithy-go v1.11.2/go.mod h1:3xHYmszWVx2c0kIwQeEVf9uSm4fYZt67FBJnwub1bgM=
|
||||
github.com/aws/smithy-go v1.17.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE=
|
||||
github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw=
|
||||
github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI=
|
||||
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
||||
github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
|
||||
github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
||||
|
@ -260,10 +294,10 @@ github.com/caio/go-tdigest/v4 v4.0.1 h1:sx4ZxjmIEcLROUPs2j1BGe2WhOtHD6VSe6NNbBdK
|
|||
github.com/caio/go-tdigest/v4 v4.0.1/go.mod h1:Wsa+f0EZnV2gShdj1adgl0tQSoXRxtM0QioTgukFw8U=
|
||||
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
|
||||
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
|
||||
github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8=
|
||||
github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
|
||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
||||
github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g=
|
||||
github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw=
|
||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
|
||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
||||
|
@ -284,9 +318,11 @@ github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWH
|
|||
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||
github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI=
|
||||
github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=
|
||||
github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls=
|
||||
github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=
|
||||
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
|
||||
github.com/coder/websocket v1.8.13 h1:f3QZdXy7uGVz+4uCJy2nTZyM0yTBj8yANEHhqlXZ9FE=
|
||||
github.com/coder/websocket v1.8.13/go.mod h1:LNVeNrXQZfe5qhS9ALED3uA+l5pPqvwXg3CKoDBB2gs=
|
||||
github.com/colinmarc/hdfs/v2 v2.1.1/go.mod h1:M3x+k8UKKmxtFu++uAZ0OtDU8jR3jnaZIAc6yK4Ue0c=
|
||||
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
|
||||
|
@ -309,13 +345,12 @@ github.com/eclipse/paho.mqtt.golang v1.5.0 h1:EH+bUVJNgttidWFkLLVKaQPGmkTUfQQqjO
|
|||
github.com/eclipse/paho.mqtt.golang v1.5.0/go.mod h1:du/2qNQVqJf/Sqs4MEL77kR8QTqANF7XU7Fk0aOTAgk=
|
||||
github.com/embano1/memlog v0.4.6 h1:GP/nFpCUYBE55FE++aJGXRBmUmwf/UmoG70PIK5BkR8=
|
||||
github.com/embano1/memlog v0.4.6/go.mod h1:5RNKsjOBS8o7GkeoS63qgnt9zsmYLRXJ2kW0hdOvT+A=
|
||||
github.com/emersion/go-sasl v0.0.0-20200509203442-7bfe0ed36a21/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ=
|
||||
github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43 h1:hH4PQfOndHDlpzYfLAAfl63E8Le6F2+EL/cdhlkyRJY=
|
||||
github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ=
|
||||
github.com/emersion/go-smtp v0.21.3 h1:7uVwagE8iPYE48WhNsng3RRpCUpFvNl39JGNSIyGVMY=
|
||||
github.com/emersion/go-smtp v0.21.3/go.mod h1:qm27SGYgoIPRot6ubfQ/GpiPy/g3PaZAVRxiO/sDUgQ=
|
||||
github.com/emicklei/go-restful/v3 v3.12.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk=
|
||||
github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
|
||||
github.com/emersion/go-sasl v0.0.0-20241020182733-b788ff22d5a6 h1:oP4q0fw+fOSWn3DfFi4EXdT+B+gTtzx8GC9xsc26Znk=
|
||||
github.com/emersion/go-sasl v0.0.0-20241020182733-b788ff22d5a6/go.mod h1:iL2twTeMvZnrg54ZoPDNfJaJaqy0xIQFuBdrLsmspwQ=
|
||||
github.com/emersion/go-smtp v0.22.0 h1:/d3HWxkZZ4riB+0kzfoODh9X+xyCrLEezMnAAa1LEMU=
|
||||
github.com/emersion/go-smtp v0.22.0/go.mod h1:ZtRRkbTyp2XTHCA+BmyTFTrj8xY4I+b4McvHxCU2gsQ=
|
||||
github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU=
|
||||
github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
|
||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
||||
|
@ -324,11 +359,15 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m
|
|||
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
|
||||
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
|
||||
github.com/envoyproxy/go-control-plane v0.13.0 h1:HzkeUz1Knt+3bK+8LG1bxOO/jzWZmdxpwC51i202les=
|
||||
github.com/envoyproxy/go-control-plane v0.13.0/go.mod h1:GRaKG3dwvFoTg4nj7aXdZnvMg4d7nvT/wl9WgVXn3Q8=
|
||||
github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M=
|
||||
github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA=
|
||||
github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A=
|
||||
github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw=
|
||||
github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI=
|
||||
github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4=
|
||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||
github.com/envoyproxy/protoc-gen-validate v1.1.0 h1:tntQDh69XqOCOZsDz0lVJQez/2L6Uu2PdjCQwWCJ3bM=
|
||||
github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4=
|
||||
github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8=
|
||||
github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU=
|
||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
|
||||
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
|
||||
|
@ -342,8 +381,8 @@ github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHqu
|
|||
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
|
||||
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
|
||||
github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
|
||||
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
|
||||
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
|
||||
github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M=
|
||||
github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
|
||||
github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
|
||||
github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
|
||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
|
@ -358,12 +397,14 @@ github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9
|
|||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
|
||||
github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE=
|
||||
github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA=
|
||||
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
|
||||
github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=
|
||||
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
|
||||
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
||||
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
|
||||
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
||||
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
||||
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
|
||||
|
@ -380,7 +421,6 @@ github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn
|
|||
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
|
||||
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
|
||||
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
|
||||
github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=
|
||||
|
@ -396,8 +436,8 @@ github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzw
|
|||
github.com/golang-jwt/jwt/v4 v4.4.1/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
|
||||
github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
|
||||
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
|
||||
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
|
||||
github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
|
||||
github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8=
|
||||
github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
|
||||
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
|
||||
github.com/golang-sql/sqlexp v0.0.0-20170517235910-f1bb20e5a188/go.mod h1:vXjM/+wXQnTPR4KqTKDgJukSZ6amVRtWMPEjE6sQoK8=
|
||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
|
||||
|
@ -405,8 +445,9 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU
|
|||
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
|
||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ=
|
||||
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw=
|
||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
||||
|
@ -446,8 +487,8 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ
|
|||
github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
|
||||
github.com/google/flatbuffers v2.0.0+incompatible h1:dicJ2oXwypfwUGnB2/TYWYEKiuk9eYQlQO/AnOHl5mI=
|
||||
github.com/google/flatbuffers v2.0.0+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
|
||||
github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
|
||||
github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
|
||||
github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw=
|
||||
github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw=
|
||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
|
@ -463,8 +504,8 @@ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
|||
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
|
||||
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
|
||||
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
|
||||
github.com/google/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk=
|
||||
|
@ -497,11 +538,11 @@ github.com/google/pprof v0.0.0-20210506205249-923b5ab0fc1a/go.mod h1:kpwsk12EmLe
|
|||
github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM=
|
||||
github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=
|
||||
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo=
|
||||
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
|
||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||
github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM=
|
||||
github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA=
|
||||
github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0=
|
||||
github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM=
|
||||
github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
|
||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
|
@ -510,21 +551,21 @@ github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
|
|||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU=
|
||||
github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw=
|
||||
github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA=
|
||||
github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4=
|
||||
github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA=
|
||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||
github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
|
||||
github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM=
|
||||
github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM=
|
||||
github.com/googleapis/gax-go/v2 v2.14.0 h1:f+jMrjBPl+DL9nI4IQzLUxMq7XrAqFYB7hBPqMNIe8o=
|
||||
github.com/googleapis/gax-go/v2 v2.14.0/go.mod h1:lhBCnjdLrWRaPvLWhmc8IS24m9mr07qSYnHncrgo+zk=
|
||||
github.com/googleapis/gax-go/v2 v2.15.0 h1:SyjDc1mGgZU5LncH8gimWo9lW1DtIfPibOG81vgd/bo=
|
||||
github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld9rcmyfL1OZhoc=
|
||||
github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
|
||||
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0 h1:ad0vkEBuk23VJzZR9nkLVG0YAoN9coASF1GusYX6AlU=
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.23.0/go.mod h1:igFoXX2ELCW06bol23DWPB5BEWfZISOzSP5K2sbLea0=
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 h1:X5VWvz21y3gzm9Nw/kaUeku/1+uBhcekkmy4IkffJww=
|
||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90=
|
||||
github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok=
|
||||
github.com/hanwen/go-fuse/v2 v2.1.0/go.mod h1:oRyA5eK+pvJyv5otpO/DgccS8y/RvYMaO00GgRLGryc=
|
||||
github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
|
||||
|
@ -588,8 +629,8 @@ github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9
|
|||
github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc=
|
||||
github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs=
|
||||
github.com/jackc/pgx/v4 v4.15.0/go.mod h1:D/zyOyXiaM1TmVWnOM18p0xdDtdakRBa0RsVGI3U3bw=
|
||||
github.com/jackc/pgx/v5 v5.7.1 h1:x7SYsPBYDkHDksogeSmZZ5xzThcTgRz++I5E+ePFUcs=
|
||||
github.com/jackc/pgx/v5 v5.7.1/go.mod h1:e7O26IywZZ+naJtWWos6i6fvWK+29etgITqrqHLfoZA=
|
||||
github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs=
|
||||
github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M=
|
||||
github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
|
||||
github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
|
||||
github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
|
||||
|
@ -599,9 +640,7 @@ github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFr
|
|||
github.com/jcmturner/gofork v0.0.0-20180107083740-2aebee971930/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o=
|
||||
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||
github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik=
|
||||
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
|
||||
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
|
||||
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
|
||||
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
|
||||
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
|
||||
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
|
||||
|
@ -615,8 +654,8 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1
|
|||
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
|
||||
github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
|
||||
github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
|
||||
github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6 h1:IsMZxCuZqKuao2vNdfD82fjjgPLfyHLpR41Z88viRWs=
|
||||
github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6/go.mod h1:3VeWNIJaW+O5xpRQbPp0Ybqu1vJd/pm7s2F473HRrkw=
|
||||
github.com/keybase/go-keychain v0.0.1 h1:way+bWYa6lDppZoZcgMbYsvC7GxljxrskdNInRtuthU=
|
||||
github.com/keybase/go-keychain v0.0.1/go.mod h1:PdEILRW3i9D8JcdM+FmY6RwkHGnhHxXwkPPMeUgOK1k=
|
||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
|
||||
|
@ -625,8 +664,8 @@ github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8
|
|||
github.com/klauspost/compress v1.14.4/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
|
||||
github.com/klauspost/compress v1.15.1/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
|
||||
github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
|
||||
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
|
||||
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
|
||||
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
|
||||
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
|
||||
github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
||||
github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
||||
github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
|
||||
|
@ -652,10 +691,10 @@ github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
|||
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
||||
github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
|
||||
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
|
||||
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
||||
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
||||
github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM=
|
||||
github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
|
||||
github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4=
|
||||
github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU=
|
||||
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
|
||||
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
|
||||
|
@ -670,8 +709,9 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky
|
|||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
|
||||
github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g=
|
||||
github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY=
|
||||
github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q=
|
||||
github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ=
|
||||
github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
|
||||
github.com/minio/minio-go/v7 v7.0.34/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw=
|
||||
github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM=
|
||||
|
@ -692,22 +732,22 @@ github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt
|
|||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
||||
github.com/nats-io/jwt/v2 v2.2.1-0.20220330180145-442af02fd36a/go.mod h1:0tqz9Hlu6bCBFLWAASKhE5vUA4c24L9KPUUgvwumE/k=
|
||||
github.com/nats-io/jwt/v2 v2.5.0 h1:WQQ40AAlqqfx+f6ku+i0pOVm+ASirD4fUh+oQsiE9Ak=
|
||||
github.com/nats-io/jwt/v2 v2.5.0/go.mod h1:24BeQtRwxRV8ruvC4CojXlx/WQ/VjuwlYiH+vu/+ibI=
|
||||
github.com/nats-io/jwt/v2 v2.7.3 h1:6bNPK+FXgBeAqdj4cYQ0F8ViHRbi7woQLq4W29nUAzE=
|
||||
github.com/nats-io/jwt/v2 v2.7.3/go.mod h1:GvkcbHhKquj3pkioy5put1wvPxs78UlZ7D/pY+BgZk4=
|
||||
github.com/nats-io/nats-server/v2 v2.8.2/go.mod h1:vIdpKz3OG+DCg4q/xVPdXHoztEyKDWRtykQ4N7hd7C4=
|
||||
github.com/nats-io/nats-server/v2 v2.9.23 h1:6Wj6H6QpP9FMlpCyWUaNu2yeZ/qGj+mdRkZ1wbikExU=
|
||||
github.com/nats-io/nats-server/v2 v2.9.23/go.mod h1:wEjrEy9vnqIGE4Pqz4/c75v9Pmaq7My2IgFmnykc4C0=
|
||||
github.com/nats-io/nats-server/v2 v2.10.27 h1:A/i3JqtrP897UHc2/Jia/mqaXkqj9+HGdpz+R0mC+sM=
|
||||
github.com/nats-io/nats-server/v2 v2.10.27/go.mod h1:SGzoWGU8wUVnMr/HJhEMv4R8U4f7hF4zDygmRxpNsvg=
|
||||
github.com/nats-io/nats-streaming-server v0.24.6 h1:iIZXuPSznnYkiy0P3L0AP9zEN9Etp+tITbbX1KKeq4Q=
|
||||
github.com/nats-io/nats-streaming-server v0.24.6/go.mod h1:tdKXltY3XLeBJ21sHiZiaPl+j8sK3vcCKBWVyxeQs10=
|
||||
github.com/nats-io/nats.go v1.13.0/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w=
|
||||
github.com/nats-io/nats.go v1.14.0/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w=
|
||||
github.com/nats-io/nats.go v1.15.0/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w=
|
||||
github.com/nats-io/nats.go v1.22.1/go.mod h1:tLqubohF7t4z3du1QDPYJIQQyhb4wl6DhjxEajSI7UA=
|
||||
github.com/nats-io/nats.go v1.37.0 h1:07rauXbVnnJvv1gfIyghFEo6lUcYRY0WXc3x7x0vUxE=
|
||||
github.com/nats-io/nats.go v1.37.0/go.mod h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8=
|
||||
github.com/nats-io/nats.go v1.39.1 h1:oTkfKBmz7W047vRxV762M67ZdXeOtUgvbBaNoQ+3PPk=
|
||||
github.com/nats-io/nats.go v1.39.1/go.mod h1:MgRb8oOdigA6cYpEPhXJuRVH6UE/V4jblJ2jQ27IXYM=
|
||||
github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4=
|
||||
github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI=
|
||||
github.com/nats-io/nkeys v0.4.7/go.mod h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc=
|
||||
github.com/nats-io/nkeys v0.4.10 h1:glmRrpCmYLHByYcePvnTBEAwawwapjCPMjy2huw20wc=
|
||||
github.com/nats-io/nkeys v0.4.10/go.mod h1:OjRrnIKnWBFl+s4YK5ChQfvHP2fxqZexrKJoVVyWB3U=
|
||||
github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
|
||||
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
|
||||
github.com/nats-io/stan.go v0.10.2/go.mod h1:vo2ax8K2IxaR3JtEMLZRFKIdoK/3o1/PKueapB7ezX0=
|
||||
|
@ -715,26 +755,27 @@ github.com/nats-io/stan.go v0.10.4 h1:19GS/eD1SeQJaVkeM9EkvEYattnvnWrZ3wkSWSw4uX
|
|||
github.com/nats-io/stan.go v0.10.4/go.mod h1:3XJXH8GagrGqajoO/9+HgPyKV5MWsv7S5ccdda+pc6k=
|
||||
github.com/ncw/swift v1.0.52/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM=
|
||||
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
|
||||
github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA=
|
||||
github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To=
|
||||
github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8=
|
||||
github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ=
|
||||
github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM=
|
||||
github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo=
|
||||
github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4=
|
||||
github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog=
|
||||
github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||
github.com/pborman/getopt v0.0.0-20180729010549-6fdd0a2c7117/go.mod h1:85jBQOZwpVEaDAr341tbn15RS4fCAsIst0qp7i8ex1o=
|
||||
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
|
||||
github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
|
||||
github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
|
||||
github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
|
||||
github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=
|
||||
github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
|
||||
github.com/pierrec/lz4/v4 v4.1.8/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
|
||||
github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
|
||||
github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=
|
||||
github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
|
||||
github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU=
|
||||
github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
|
||||
github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA=
|
||||
github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ=
|
||||
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI=
|
||||
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
|
||||
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo=
|
||||
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8=
|
||||
|
@ -742,23 +783,23 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
|
|||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
|
||||
github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
|
||||
github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
|
||||
github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=
|
||||
github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
|
||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
|
||||
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
|
||||
github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||
github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc=
|
||||
github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
|
||||
github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io=
|
||||
github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I=
|
||||
github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
|
||||
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
|
||||
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
|
||||
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
|
||||
github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw=
|
||||
github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o=
|
||||
github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E=
|
||||
github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw=
|
||||
github.com/redis/go-redis/v9 v9.8.0 h1:q3nRvjrlge/6UD7eTu/DSg2uYiU2mCL0G/uzBWqhicI=
|
||||
github.com/redis/go-redis/v9 v9.8.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw=
|
||||
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
|
||||
|
@ -768,13 +809,13 @@ github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
|
|||
github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
|
||||
github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
|
||||
github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=
|
||||
github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
|
||||
github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
|
||||
github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo=
|
||||
github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k=
|
||||
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
|
||||
github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
|
||||
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
|
||||
github.com/segmentio/kafka-go v0.4.47 h1:IqziR4pA3vrZq7YdRxaT3w1/5fvIH5qpCwstUanQQB0=
|
||||
github.com/segmentio/kafka-go v0.4.47/go.mod h1:HjF6XbOKh0Pjlkr5GVZxt6CsjjwnmhVOfURM5KMd8qg=
|
||||
github.com/segmentio/kafka-go v0.4.48 h1:9jyu9CWK4W5W+SroCe8EffbrRZVqAOkuaLd/ApID4Vs=
|
||||
github.com/segmentio/kafka-go v0.4.48/go.mod h1:HjF6XbOKh0Pjlkr5GVZxt6CsjjwnmhVOfURM5KMd8qg=
|
||||
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
|
||||
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
|
||||
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
|
||||
|
@ -784,14 +825,16 @@ github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9yS
|
|||
github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
|
||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
|
||||
github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
|
||||
github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY=
|
||||
github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=
|
||||
github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
|
||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs=
|
||||
github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4=
|
||||
github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=
|
||||
github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
|
||||
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
|
||||
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||
github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=
|
||||
github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg=
|
||||
github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE=
|
||||
github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
|
||||
|
@ -815,6 +858,8 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf
|
|||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
|
||||
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
|
||||
github.com/telkomdev/go-stash v1.0.6 h1:kWvGHBPdhE+OZMqI50qBF3yTl8jirIvT/SSAH+7dXfM=
|
||||
github.com/telkomdev/go-stash v1.0.6/go.mod h1:HpABvMdvmsTtLrqK59YV44lrdfXQtoKX5RPehHD/zQQ=
|
||||
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
|
||||
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
|
||||
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
|
||||
|
@ -837,17 +882,19 @@ github.com/xitongsys/parquet-go v1.6.2 h1:MhCaXii4eqceKPu9BwrjLqyK10oX9WF+xGhwvw
|
|||
github.com/xitongsys/parquet-go v1.6.2/go.mod h1:IulAQyalCm0rPiZVNnCgm/PCL64X2tdSVGMQ/UeKqWA=
|
||||
github.com/xitongsys/parquet-go-source v0.0.0-20190524061010-2b72cbee77d5/go.mod h1:xxCx7Wpym/3QCo6JhujJX51dzSXrwmb0oH6FQb39SEA=
|
||||
github.com/xitongsys/parquet-go-source v0.0.0-20200817004010-026bad9b25d0/go.mod h1:HYhIKsdns7xz80OgkbgJYrtQY7FjHWHKH6cvN7+czGE=
|
||||
github.com/xitongsys/parquet-go-source v0.0.0-20240122235623-d6294584ab18 h1:Loknf8YcZNXiweAsfz8GD79m4WE0MSbf1Bl4YCAfFYQ=
|
||||
github.com/xitongsys/parquet-go-source v0.0.0-20240122235623-d6294584ab18/go.mod h1:2ActxmJ4q17Cdruar9nKEkzKSOL1Ol03737Bkz10rTY=
|
||||
github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b h1:zbb5qM/t3N+O33Vp5sFyG6yIcWZV1q7rfEjJM8UsRBQ=
|
||||
github.com/xitongsys/parquet-go-source v0.0.0-20241021075129-b732d2ac9c9b/go.mod h1:2ActxmJ4q17Cdruar9nKEkzKSOL1Ol03737Bkz10rTY=
|
||||
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||
github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM=
|
||||
github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=
|
||||
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
|
||||
go.einride.tech/aip v0.68.0 h1:4seM66oLzTpz50u4K1zlJyOXQ3tCzcJN7I22tKkjipw=
|
||||
go.einride.tech/aip v0.68.0/go.mod h1:7y9FF8VtPWqpxuAxl0KQWqaULxW4zFIesD6zF5RIHHg=
|
||||
go.einride.tech/aip v0.68.1 h1:16/AfSxcQISGN5z9C5lM+0mLYXihrHbQ1onvYTr93aQ=
|
||||
go.einride.tech/aip v0.68.1/go.mod h1:XaFtaj4HuA3Zwk9xoBtTWgNubZ0ZZXv9BZJCkuKuWbg=
|
||||
go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU=
|
||||
go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4=
|
||||
go.opencensus.io v0.15.0/go.mod h1:UffZAU+4sDEINUGP/B7UfBBkq4fqLu9zXAX7ke6CHW0=
|
||||
|
@ -860,35 +907,51 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
|
|||
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
|
||||
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
|
||||
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
|
||||
go.opentelemetry.io/contrib/detectors/gcp v1.29.0 h1:TiaiXB4DpGD3sdzNlYQxruQngn5Apwzi1X0DRhuGvDQ=
|
||||
go.opentelemetry.io/contrib/detectors/gcp v1.29.0/go.mod h1:GW2aWZNwR2ZxDLdv8OyC2G8zkRoQBuURgV7RPQgcPoU=
|
||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc=
|
||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI=
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk=
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8=
|
||||
go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U=
|
||||
go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0 h1:j7ZSD+5yn+lo3sGV69nW04rRR0jhYnBwjuX3r0HvnK0=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.32.0/go.mod h1:WXbYJTUaZXAbYd8lbgGuvih0yuCfOFC5RJoYnoLcGz8=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0 h1:t/Qur3vKSkUCcDVaSumWF2PKHt85pc7fRvFuoVT8qFU=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.32.0/go.mod h1:Rl61tySSdcOJWoEgYZVtmnKdA0GeKrSqkHC1t+91CH8=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0 h1:IJFEoHiytixx8cMiVAO+GmHR6Frwu+u5Ur8njpFO6Ac=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.32.0/go.mod h1:3rHrKNtLIoS0oZwkY2vxi+oJcwFRWdtUyRII+so45p8=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0 h1:cMyu9O88joYEaI47CnQkxO1XZdpoTF9fEnW2duIddhw=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.32.0/go.mod h1:6Am3rn7P9TVVeXYG+wtcGE7IE1tsQ+bP3AuWcKt/gOI=
|
||||
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc=
|
||||
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I=
|
||||
go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M=
|
||||
go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8=
|
||||
go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4=
|
||||
go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU=
|
||||
go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU=
|
||||
go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ=
|
||||
go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM=
|
||||
go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8=
|
||||
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
|
||||
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
|
||||
go.opentelemetry.io/contrib/bridges/otelslog v0.10.0 h1:lRKWBp9nWoBe1HKXzc3ovkro7YZSb72X2+3zYNxfXiU=
|
||||
go.opentelemetry.io/contrib/bridges/otelslog v0.10.0/go.mod h1:D+iyUv/Wxbw5LUDO5oh7x744ypftIryiWjoj42I6EKs=
|
||||
go.opentelemetry.io/contrib/detectors/gcp v1.36.0 h1:F7q2tNlCaHY9nMKHR6XH9/qkp8FktLnIcy6jJNyOCQw=
|
||||
go.opentelemetry.io/contrib/detectors/gcp v1.36.0/go.mod h1:IbBN8uAIIx734PTonTPxAxnjc2pQTxWNkwfstZ+6H2k=
|
||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 h1:q4XOmH/0opmeuJtPsbFNivyl7bCt7yRBbeEm2sC/XtQ=
|
||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo=
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus=
|
||||
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q=
|
||||
go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
|
||||
go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.13.0 h1:z6lNIajgEBVtQZHjfw2hAccPEBDs+nx58VemmXWa2ec=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.13.0/go.mod h1:+kyc3bRx/Qkq05P6OCu3mTEIOxYRYzoIg+JsUp5X+PM=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 h1:q/heq5Zh8xV1+7GoMGJpTxM2Lhq5+bFxB29tshuRuw0=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0/go.mod h1:leO2CSTg0Y+LyvmR7Wm4pUxE8KAmaM2GCVx7O+RATLA=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.35.0 h1:QcFwRrZLc82r8wODjvyCbP7Ifp3UANaBSmhDSFjnqSc=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.35.0/go.mod h1:CXIWhUomyWBG/oY2/r/kLp6K/cmx9e/7DLpBuuGdLCA=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.36.0 h1:gAU726w9J8fwr4qRDqu1GYMNNs4gXrU+Pv20/N1UpB4=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.36.0/go.mod h1:RboSDkp7N292rgu+T0MgVt2qgFGu6qa1RpZDOtpL76w=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 h1:BEj3SPM81McUZHYjRS5pEgNgnmzGJ5tRpU5krWnV8Bs=
|
||||
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0/go.mod h1:9cKLGBDzI/F3NoHLQGm4ZrYdIHsvGt6ej6hUowxY0J4=
|
||||
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 h1:rixTyDGXFxRy1xzhKrotaHy3/KXdPhlWARrCgK+eqUY=
|
||||
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0/go.mod h1:dowW6UsM9MKbJq5JTz2AMVp3/5iW5I/TStsk8S+CfHw=
|
||||
go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls=
|
||||
go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E=
|
||||
go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
|
||||
go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
|
||||
go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
|
||||
go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
|
||||
go.opentelemetry.io/otel/sdk/log v0.13.0 h1:I3CGUszjM926OphK8ZdzF+kLqFvfRY/IIoFq/TjwfaQ=
|
||||
go.opentelemetry.io/otel/sdk/log v0.13.0/go.mod h1:lOrQyCCXmpZdN7NchXb6DOZZa1N5G1R2tm5GMMTpDBw=
|
||||
go.opentelemetry.io/otel/sdk/log/logtest v0.13.0 h1:9yio6AFZ3QD9j9oqshV1Ibm9gPLlHNxurno5BreMtIA=
|
||||
go.opentelemetry.io/otel/sdk/log/logtest v0.13.0/go.mod h1:QOGiAJHl+fob8Nu85ifXfuQYmJTFAvcrxL6w5/tu168=
|
||||
go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis=
|
||||
go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4=
|
||||
go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
|
||||
go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
|
||||
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
||||
go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0=
|
||||
go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8=
|
||||
go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os=
|
||||
go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo=
|
||||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
|
||||
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
||||
|
@ -937,8 +1000,8 @@ golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU
|
|||
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
|
||||
golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
|
||||
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
|
||||
golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ=
|
||||
golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg=
|
||||
golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
|
||||
golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
|
||||
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
|
@ -953,8 +1016,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
|
|||
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
||||
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
||||
golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f h1:99ci1mjWVBWwJiEKYY6jWa4d2nTQVIEhZIptnrVb1XY=
|
||||
golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f/go.mod h1:/lliqkxwWAhPjf5oSOIJup2XcqJaw8RGS6k3TGEc7GI=
|
||||
golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c h1:KL/ZBHXgKGVmuZBZ01Lt57yE5ws8ZPSkkihmEyq7FXc=
|
||||
golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU=
|
||||
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
|
||||
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
|
@ -1046,8 +1109,8 @@ golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
|||
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
|
||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
|
||||
golang.org/x/net v0.31.0 h1:68CPQngjLL0r2AlUKiSxtQFKvzRVbnzLwMUn5SzcLHo=
|
||||
golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM=
|
||||
golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
|
||||
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
|
||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||
|
@ -1068,8 +1131,8 @@ golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ
|
|||
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
|
||||
golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
|
||||
golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE=
|
||||
golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
||||
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
|
||||
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
|
@ -1083,8 +1146,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ
|
|||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.9.0 h1:fEo0HyrW1GIgZdpbhCRO0PkJajUS5H9IFUztCgEo2jQ=
|
||||
golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
|
||||
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
|
@ -1172,8 +1235,8 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
|
||||
golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
|
||||
golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
|
@ -1182,8 +1245,8 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
|||
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
|
||||
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
|
||||
golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U=
|
||||
golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU=
|
||||
golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E=
|
||||
golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg=
|
||||
golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0=
|
||||
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
|
@ -1199,15 +1262,15 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
|||
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/text v0.20.0 h1:gK/Kv2otX8gz+wn7Rmb3vT96ZwuoxnQlY+HlJVj7Qug=
|
||||
golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4=
|
||||
golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
|
||||
golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
|
||||
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg=
|
||||
golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
||||
golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
|
||||
golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
|
||||
golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
|
@ -1276,16 +1339,16 @@ golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
|||
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg=
|
||||
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
|
||||
golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
|
||||
golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
|
||||
golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU=
|
||||
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
|
||||
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY=
|
||||
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
|
||||
gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
|
||||
gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=
|
||||
gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=
|
||||
|
@ -1338,8 +1401,8 @@ google.golang.org/api v0.69.0/go.mod h1:boanBiw+h5c3s+tBPgEzLDRHfFLWV0qXxRHz3ws7
|
|||
google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA=
|
||||
google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8=
|
||||
google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs=
|
||||
google.golang.org/api v0.209.0 h1:Ja2OXNlyRlWCWu8o+GgI4yUn/wz9h/5ZfFbKz+dQX+w=
|
||||
google.golang.org/api v0.209.0/go.mod h1:I53S168Yr/PNDNMi5yPnDc0/LGRZO6o7PoEbl/HY3CM=
|
||||
google.golang.org/api v0.243.0 h1:sw+ESIJ4BVnlJcWu9S+p2Z6Qq1PjG77T8IJ1xtp4jZQ=
|
||||
google.golang.org/api v0.243.0/go.mod h1:GE4QtYfaybx1KmeHMdBnNnyLzBZCVihGBXAmJu/uUr8=
|
||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||
|
@ -1433,12 +1496,12 @@ google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2
|
|||
google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
|
||||
google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E=
|
||||
google.golang.org/genproto v0.0.0-20220401170504-314d38edb7de/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
|
||||
google.golang.org/genproto v0.0.0-20241113202542-65e8d215514f h1:zDoHYmMzMacIdjNe+P2XiTmPsLawi/pCbSPfxt6lTfw=
|
||||
google.golang.org/genproto v0.0.0-20241113202542-65e8d215514f/go.mod h1:Q5m6g8b5KaFFzsQFIGdJkSJDGeJiybVenoYFMMa3ohI=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28 h1:M0KvPgPmDZHPlbRbaNU1APr28TvwvvdUPlSv7PUvy8g=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20241113202542-65e8d215514f h1:C1QccEa9kUwvMgEUORqQD9S17QesQijxjZ84sO82mfo=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20241113202542-65e8d215514f/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI=
|
||||
google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuOnu87KpaYtjK5zBMLcULh7gxkCXu4=
|
||||
google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20250721164621-a45f3dfb1074 h1:mVXdvnmR3S3BQOqHECm9NGMjYiRtEvDYcqAqedTXY6s=
|
||||
google.golang.org/genproto/googleapis/api v0.0.0-20250721164621-a45f3dfb1074/go.mod h1:vYFwMYFbmA8vl6Z/krj/h7+U/AqpHknwJX4Uqgfyc7I=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250721164621-a45f3dfb1074 h1:qJW29YvkiJmXOYMu5Tf8lyrTp3dOS+K4z6IixtLaCf8=
|
||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20250721164621-a45f3dfb1074/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
|
||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||
|
@ -1468,11 +1531,9 @@ google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9K
|
|||
google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
|
||||
google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
|
||||
google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
|
||||
google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E=
|
||||
google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA=
|
||||
google.golang.org/grpc v1.74.2 h1:WoosgB65DlWVC9FqI82dGsZhWFNBSLjQ84bjROOpMu4=
|
||||
google.golang.org/grpc v1.74.2/go.mod h1:CtQ+BGjaAIXHs/5YS3i473GqwBBa1zGQNevxdeBEXrM=
|
||||
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
|
||||
google.golang.org/grpc/stats/opentelemetry v0.0.0-20240907200651-3ffb98b2c93a h1:UIpYSuWdWHSzjwcAFRLjKcPXFZVVLXGEM23W+NWqipw=
|
||||
google.golang.org/grpc/stats/opentelemetry v0.0.0-20240907200651-3ffb98b2c93a/go.mod h1:9i1T9n4ZinTUZGgzENMi8MDDgbGC5mqTS75JAv6xN3A=
|
||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||
|
@ -1487,13 +1548,15 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0
|
|||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
||||
google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io=
|
||||
google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
|
||||
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
|
||||
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||
gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4=
|
||||
gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M=
|
||||
gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s=
|
||||
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
|
||||
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
|
||||
|
@ -1509,7 +1572,6 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
|
@ -1524,31 +1586,29 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
|
|||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||
k8s.io/api v0.31.3 h1:umzm5o8lFbdN/hIXbrK9oRpOproJO62CV1zqxXrLgk8=
|
||||
k8s.io/api v0.31.3/go.mod h1:UJrkIp9pnMOI9K2nlL6vwpxRzzEX5sWgn8kGQe92kCE=
|
||||
k8s.io/apimachinery v0.31.3 h1:6l0WhcYgasZ/wk9ktLq5vLaoXJJr5ts6lkaQzgeYPq4=
|
||||
k8s.io/apimachinery v0.31.3/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo=
|
||||
k8s.io/client-go v0.31.3 h1:CAlZuM+PH2cm+86LOBemaJI/lQ5linJ6UFxKX/SoG+4=
|
||||
k8s.io/client-go v0.31.3/go.mod h1:2CgjPUTpv3fE5dNygAr2NcM8nhHzXvxB8KL5gYc3kJs=
|
||||
k8s.io/api v0.32.3 h1:Hw7KqxRusq+6QSplE3NYG4MBxZw1BZnq4aP4cJVINls=
|
||||
k8s.io/api v0.32.3/go.mod h1:2wEDTXADtm/HA7CCMD8D8bK4yuBUptzaRhYcYEEYA3k=
|
||||
k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U=
|
||||
k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
|
||||
k8s.io/client-go v0.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU=
|
||||
k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY=
|
||||
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
|
||||
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
|
||||
k8s.io/kube-openapi v0.0.0-20240423202451-8948a665c108 h1:Q8Z7VlGhcJgBHJHYugJ/K/7iB8a2eSxCyxdVjJp+lLY=
|
||||
k8s.io/kube-openapi v0.0.0-20240423202451-8948a665c108/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98=
|
||||
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A=
|
||||
k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
||||
k8s.io/kube-openapi v0.0.0-20241212222426-2c72e554b1e7 h1:hcha5B1kVACrLujCKLbr8XWMxCxzQx42DY8QKYJrDLg=
|
||||
k8s.io/kube-openapi v0.0.0-20241212222426-2c72e554b1e7/go.mod h1:GewRfANuJ70iYzvn+i4lezLDAFzvjxZYK1gn1lWcfas=
|
||||
k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0=
|
||||
k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
||||
nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0=
|
||||
nhooyr.io/websocket v1.8.11 h1:f/qXNc2/3DpoSZkHt1DQu6rj4zGC8JmkkLkWss0MgN0=
|
||||
nhooyr.io/websocket v1.8.11/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c=
|
||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
||||
rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
|
||||
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
||||
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
||||
sigs.k8s.io/controller-runtime v0.17.3 h1:65QmN7r3FWgTxDMz9fvGnO1kbf2nu+acg9p2R9oYYYk=
|
||||
sigs.k8s.io/controller-runtime v0.17.3/go.mod h1:N0jpP5Lo7lMTF9aL56Z/B2oWBJjey6StQM0jRbKQXtY=
|
||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
|
||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
|
||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
|
||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08=
|
||||
sigs.k8s.io/controller-runtime v0.20.1 h1:JbGMAG/X94NeM3xvjenVUaBjy6Ui4Ogd/J5ZtjZnHaE=
|
||||
sigs.k8s.io/controller-runtime v0.20.1/go.mod h1:BrP3w158MwvB3ZbNpaAcIKkHQ7YGpYnzpoSTZ8E14WU=
|
||||
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE=
|
||||
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
|
||||
sigs.k8s.io/structured-merge-diff/v4 v4.5.0 h1:nbCitCK2hfnhyiKo6uf2HxUPTCodY6Qaf85SbDIaMBk=
|
||||
sigs.k8s.io/structured-merge-diff/v4 v4.5.0/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4=
|
||||
sigs.k8s.io/wg-policy-prototypes v0.0.0-20240327135653-0fc2ddc5d3e3 h1:fBHuQKI5AonDZsH6QWmS5ovZwWjbLqSIMBDctZb2+PU=
|
||||
sigs.k8s.io/wg-policy-prototypes v0.0.0-20240327135653-0fc2ddc5d3e3/go.mod h1:SwYw1f7GwlQENppzm94XW/uT/xfbLwKg3iCd4uzpy4k=
|
||||
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
|
||||
|
|
28
handlers.go
28
handlers.go
|
@ -6,9 +6,7 @@ import (
|
|||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"sort"
|
||||
"strconv"
|
||||
|
@ -16,10 +14,13 @@ import (
|
|||
"text/template"
|
||||
"time"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
"github.com/google/uuid"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"golang.org/x/text/cases"
|
||||
"golang.org/x/text/language"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
const (
|
||||
|
@ -90,7 +91,7 @@ func healthHandler(w http.ResponseWriter, r *http.Request) {
|
|||
|
||||
// testHandler sends a test event to all enabled outputs.
|
||||
func testHandler(w http.ResponseWriter, r *http.Request) {
|
||||
r.Body = io.NopCloser(bytes.NewReader([]byte(`{"output":"This is a test from falcosidekick","priority":"Debug","hostname": "falcosidekick", "rule":"Test rule", "time":"` + time.Now().UTC().Format(time.RFC3339) + `","output_fields": {"proc.name":"falcosidekick","user.name":"falcosidekick"}, "tags":["test","example"]}`)))
|
||||
r.Body = io.NopCloser(bytes.NewReader([]byte(`{"output":"This is a test from falcosidekick","source":"debug","priority":"Debug","hostname":"falcosidekick", "rule":"Test rule","time":"` + time.Now().UTC().Format(time.RFC3339) + `","output_fields":{"proc.name":"falcosidekick","user.name":"falcosidekick"},"tags":["test","example"]}`)))
|
||||
mainHandler(w, r)
|
||||
}
|
||||
|
||||
|
@ -148,12 +149,12 @@ func newFalcoPayload(payload io.Reader) (types.FalcoPayload, error) {
|
|||
for key, value := range config.Templatedfields {
|
||||
tmpl, err := template.New("").Parse(value)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : Parsing error for templated field '%v': %v\n", key, err)
|
||||
utils.Log(utils.ErrorLvl, "", fmt.Sprintf("Parsing error for templated field '%v': %v", key, err))
|
||||
continue
|
||||
}
|
||||
v := new(bytes.Buffer)
|
||||
if err := tmpl.Execute(v, falcopayload.OutputFields); err != nil {
|
||||
log.Printf("[ERROR] : Parsing error for templated field '%v': %v\n", key, err)
|
||||
utils.Log(utils.ErrorLvl, "", fmt.Sprintf("Parsing error for templated field '%v': %v", key, err))
|
||||
}
|
||||
templatedFields += key + "=" + v.String() + " "
|
||||
falcopayload.OutputFields[key] = v.String()
|
||||
|
@ -185,6 +186,11 @@ func newFalcoPayload(payload io.Reader) (types.FalcoPayload, error) {
|
|||
promLabels[key] = value
|
||||
}
|
||||
}
|
||||
for key := range config.Templatedfields {
|
||||
if regPromLabels.MatchString(strings.ReplaceAll(key, ".", "_")) {
|
||||
promLabels[key] = fmt.Sprintf("%v", falcopayload.OutputFields[key])
|
||||
}
|
||||
}
|
||||
for _, i := range config.Prometheus.ExtraLabelsList {
|
||||
promLabels[strings.ReplaceAll(i, ".", "_")] = ""
|
||||
for key, value := range falcopayload.OutputFields {
|
||||
|
@ -281,7 +287,7 @@ func newFalcoPayload(payload io.Reader) (types.FalcoPayload, error) {
|
|||
}
|
||||
|
||||
if config.Debug {
|
||||
log.Printf("[DEBUG] : Falco's payload : %v\n", falcopayload.String())
|
||||
utils.Log(utils.DebugLvl, "", fmt.Sprintf("Falco's payload : %v", falcopayload.String()))
|
||||
}
|
||||
|
||||
return falcopayload, nil
|
||||
|
@ -539,7 +545,15 @@ func forwardEvent(falcopayload types.FalcoPayload) {
|
|||
go otlpTracesClient.OTLPTracesPost(falcopayload)
|
||||
}
|
||||
|
||||
if config.OTLP.Logs.Endpoint != "" && (falcopayload.Priority >= types.Priority(config.OTLP.Logs.MinimumPriority)) {
|
||||
go otlpLogsClient.OTLPLogsPost(falcopayload)
|
||||
}
|
||||
|
||||
if config.Talon.Address != "" && (falcopayload.Priority >= types.Priority(config.Talon.MinimumPriority) || falcopayload.Rule == testRule) {
|
||||
go talonClient.TalonPost(falcopayload)
|
||||
}
|
||||
|
||||
if config.Logstash.Address != "" && (falcopayload.Priority >= types.Priority(config.Logstash.MinimumPriority) || falcopayload.Rule == testRule) {
|
||||
go logstashClient.LogstashPost(falcopayload)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,10 +8,10 @@ import (
|
|||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
|
||||
"github.com/google/go-cmp/cmp"
|
||||
"github.com/google/uuid"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
func TestElasticsearchBatcher(t *testing.T) {
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
// SPDX-License-Identifier: MIT OR Apache-2.0
|
||||
|
||||
package utils
|
||||
|
||||
import "log"
|
||||
|
||||
const (
|
||||
InfoLvl string = "info"
|
||||
InfoPrefix string = "[INFO] "
|
||||
ErrorLvl string = "error"
|
||||
ErrorPrefix string = "[ERROR]"
|
||||
DebugLvl string = "debug"
|
||||
DebugPrefix string = "[DEBUG]"
|
||||
WarningLvl string = "warning"
|
||||
WarningPrefix string = "[WARN] "
|
||||
FatalLvl string = "fatal"
|
||||
FatalPrefix string = "[FATAL]"
|
||||
)
|
||||
|
||||
func Log(level, output, msg string) {
|
||||
var prefix string
|
||||
switch level {
|
||||
case InfoLvl:
|
||||
prefix = InfoPrefix
|
||||
case ErrorLvl:
|
||||
prefix = ErrorPrefix
|
||||
case DebugLvl:
|
||||
prefix = DebugPrefix
|
||||
case WarningLvl:
|
||||
prefix = WarningPrefix
|
||||
}
|
||||
if output != "" {
|
||||
log.Printf("%v : %v - %v", prefix, output, msg)
|
||||
} else {
|
||||
log.Printf("%v : %v", prefix, msg)
|
||||
}
|
||||
}
|
102
main.go
102
main.go
|
@ -7,8 +7,6 @@ import (
|
|||
"crypto/tls"
|
||||
"crypto/x509"
|
||||
"fmt"
|
||||
"github.com/falcosecurity/falcosidekick/outputs/otlpmetrics"
|
||||
"log"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
|
@ -18,10 +16,11 @@ import (
|
|||
|
||||
"github.com/DataDog/datadog-go/statsd"
|
||||
"github.com/embano1/memlog"
|
||||
|
||||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/outputs"
|
||||
otlpmetrics "github.com/falcosecurity/falcosidekick/outputs/otlp_metrics"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -81,7 +80,9 @@ var (
|
|||
openObserveClient *outputs.Client
|
||||
dynatraceClient *outputs.Client
|
||||
otlpTracesClient *outputs.Client
|
||||
otlpLogsClient *outputs.Client
|
||||
talonClient *outputs.Client
|
||||
logstashClient *outputs.Client
|
||||
|
||||
statsdClient, dogstatsdClient *statsd.Client
|
||||
config *types.Configuration
|
||||
|
@ -97,6 +98,8 @@ var (
|
|||
)
|
||||
|
||||
func init() {
|
||||
utils.Log(utils.InfoLvl, "", fmt.Sprintf("Falcosidekick version: %s", GetVersionInfo().GitVersion))
|
||||
|
||||
// detect unit testing and skip init.
|
||||
// see: https://github.com/alecthomas/kingpin/issues/187
|
||||
testing := (strings.HasSuffix(os.Args[0], ".test") ||
|
||||
|
@ -564,7 +567,7 @@ func init() {
|
|||
var err error
|
||||
kubelessClient, err = outputs.NewKubelessClient(config, stats, promStats, otlpMetrics, statsdClient, dogstatsdClient)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : Kubeless - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, kubelessClient.OutputType, err.Error())
|
||||
config.Kubeless.Namespace = ""
|
||||
config.Kubeless.Function = ""
|
||||
} else {
|
||||
|
@ -596,7 +599,7 @@ func init() {
|
|||
var err error
|
||||
openfaasClient, err = outputs.NewOpenfaasClient(config, stats, promStats, otlpMetrics, statsdClient, dogstatsdClient)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : OpenFaaS - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, openfaasClient.OutputType, err.Error())
|
||||
} else {
|
||||
outputs.EnabledOutputs = append(outputs.EnabledOutputs, "OpenFaaS")
|
||||
}
|
||||
|
@ -606,7 +609,7 @@ func init() {
|
|||
var err error
|
||||
tektonClient, err = outputs.NewClient("Tekton", config.Tekton.EventListener, config.Tekton.CommonConfig, *initClientArgs)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : Tekton - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, tektonClient.OutputType, err.Error())
|
||||
} else {
|
||||
outputs.EnabledOutputs = append(outputs.EnabledOutputs, "Tekton")
|
||||
}
|
||||
|
@ -626,7 +629,7 @@ func init() {
|
|||
var err error
|
||||
wavefrontClient, err = outputs.NewWavefrontClient(config, stats, promStats, otlpMetrics, statsdClient, dogstatsdClient)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : Wavefront - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, wavefrontClient.OutputType, err.Error())
|
||||
config.Wavefront.EndpointHost = ""
|
||||
} else {
|
||||
outputs.EnabledOutputs = append(outputs.EnabledOutputs, "Wavefront")
|
||||
|
@ -637,7 +640,7 @@ func init() {
|
|||
var err error
|
||||
fissionClient, err = outputs.NewFissionClient(config, stats, promStats, otlpMetrics, statsdClient, dogstatsdClient)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : Fission - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, fissionClient.OutputType, err.Error())
|
||||
} else {
|
||||
outputs.EnabledOutputs = append(outputs.EnabledOutputs, outputs.Fission)
|
||||
}
|
||||
|
@ -672,7 +675,7 @@ func init() {
|
|||
yandexClient, err = outputs.NewYandexClient(config, stats, promStats, otlpMetrics, statsdClient, dogstatsdClient)
|
||||
if err != nil {
|
||||
config.Yandex.S3.Bucket = ""
|
||||
log.Printf("[ERROR] : Yandex - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, yandexClient.OutputType, err.Error())
|
||||
} else {
|
||||
if config.Yandex.S3.Bucket != "" {
|
||||
outputs.EnabledOutputs = append(outputs.EnabledOutputs, "YandexS3")
|
||||
|
@ -685,7 +688,7 @@ func init() {
|
|||
yandexClient, err = outputs.NewYandexClient(config, stats, promStats, otlpMetrics, statsdClient, dogstatsdClient)
|
||||
if err != nil {
|
||||
config.Yandex.DataStreams.StreamName = ""
|
||||
log.Printf("[ERROR] : Yandex - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, yandexClient.OutputType, err.Error())
|
||||
} else {
|
||||
if config.Yandex.DataStreams.StreamName != "" {
|
||||
outputs.EnabledOutputs = append(outputs.EnabledOutputs, "YandexDataStreams")
|
||||
|
@ -698,7 +701,7 @@ func init() {
|
|||
syslogClient, err = outputs.NewSyslogClient(config, stats, promStats, otlpMetrics, statsdClient, dogstatsdClient)
|
||||
if err != nil {
|
||||
config.Syslog.Host = ""
|
||||
log.Printf("[ERROR] : Syslog - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, syslogClient.OutputType, err.Error())
|
||||
} else {
|
||||
outputs.EnabledOutputs = append(outputs.EnabledOutputs, "Syslog")
|
||||
}
|
||||
|
@ -709,7 +712,7 @@ func init() {
|
|||
mqttClient, err = outputs.NewMQTTClient(config, stats, promStats, otlpMetrics, statsdClient, dogstatsdClient)
|
||||
if err != nil {
|
||||
config.MQTT.Broker = ""
|
||||
log.Printf("[ERROR] : MQTT - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, mqttClient.OutputType, err.Error())
|
||||
} else {
|
||||
outputs.EnabledOutputs = append(outputs.EnabledOutputs, "MQTT")
|
||||
}
|
||||
|
@ -742,7 +745,7 @@ func init() {
|
|||
spyderbatClient, err = outputs.NewSpyderbatClient(config, stats, promStats, otlpMetrics, statsdClient, dogstatsdClient)
|
||||
if err != nil {
|
||||
config.Spyderbat.OrgUID = ""
|
||||
log.Printf("[ERROR] : Spyderbat - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, spyderbatClient.OutputType, err.Error())
|
||||
} else {
|
||||
outputs.EnabledOutputs = append(outputs.EnabledOutputs, "Spyderbat")
|
||||
}
|
||||
|
@ -753,7 +756,7 @@ func init() {
|
|||
timescaleDBClient, err = outputs.NewTimescaleDBClient(config, stats, promStats, otlpMetrics, statsdClient, dogstatsdClient)
|
||||
if err != nil {
|
||||
config.TimescaleDB.Host = ""
|
||||
log.Printf("[ERROR] : TimescaleDB - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, timescaleDBClient.OutputType, err.Error())
|
||||
} else {
|
||||
outputs.EnabledOutputs = append(outputs.EnabledOutputs, "TimescaleDB")
|
||||
}
|
||||
|
@ -769,6 +772,16 @@ func init() {
|
|||
}
|
||||
}
|
||||
|
||||
if config.Logstash.Address != "" {
|
||||
var err error
|
||||
logstashClient, err = outputs.NewLogstashClient(config, stats, promStats, statsdClient, dogstatsdClient)
|
||||
if err != nil {
|
||||
config.Logstash.Address = ""
|
||||
} else {
|
||||
outputs.EnabledOutputs = append(outputs.EnabledOutputs, "Logstash")
|
||||
}
|
||||
}
|
||||
|
||||
if config.Telegram.ChatID != "" && config.Telegram.Token != "" {
|
||||
var err error
|
||||
var urlFormat = "https://api.telegram.org/bot%s/sendMessage"
|
||||
|
@ -779,7 +792,7 @@ func init() {
|
|||
config.Telegram.ChatID = ""
|
||||
config.Telegram.Token = ""
|
||||
|
||||
log.Printf("[ERROR] : Telegram - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, telegramClient.OutputType, err.Error())
|
||||
} else {
|
||||
outputs.EnabledOutputs = append(outputs.EnabledOutputs, "Telegram")
|
||||
}
|
||||
|
@ -809,7 +822,7 @@ func init() {
|
|||
if config.Dynatrace.APIToken != "" && config.Dynatrace.APIUrl != "" {
|
||||
var err error
|
||||
dynatraceApiUrl := strings.TrimRight(config.Dynatrace.APIUrl, "/") + "/v2/logs/ingest"
|
||||
dynatraceClient, err = outputs.NewClient("Dynatrace", dynatraceApiUrl, types.CommonConfig{CheckCert: config.Dynatrace.CheckCert}, *initClientArgs)
|
||||
dynatraceClient, err = outputs.NewClient("Dynatrace,", dynatraceApiUrl, types.CommonConfig{CheckCert: config.Dynatrace.CheckCert}, *initClientArgs)
|
||||
if err != nil {
|
||||
config.Dynatrace.APIToken = ""
|
||||
config.Dynatrace.APIUrl = ""
|
||||
|
@ -829,15 +842,27 @@ func init() {
|
|||
}
|
||||
}
|
||||
|
||||
if cfg := config.OTLP.Metrics; cfg.Endpoint != "" {
|
||||
shutDownFunc, err := otlpmetrics.InitProvider(context.Background(), &cfg)
|
||||
if config.OTLP.Logs.Endpoint != "" {
|
||||
var err error
|
||||
otlpLogsClient, err = outputs.NewOtlpLogsClient(config, stats, promStats, otlpMetrics, statsdClient, dogstatsdClient)
|
||||
if err != nil {
|
||||
cfg.Endpoint = ""
|
||||
config.OTLP.Logs.Endpoint = ""
|
||||
} else {
|
||||
outputs.EnabledOutputs = append(outputs.EnabledOutputs, "OTLPLogs")
|
||||
shutDownFuncs = append(shutDownFuncs, otlpLogsClient.ShutDownFunc)
|
||||
}
|
||||
}
|
||||
|
||||
if config.OTLP.Metrics.Endpoint != "" {
|
||||
shutDownFunc, err := otlpmetrics.InitProvider(context.Background(), &config.OTLP.Metrics)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
config.OTLP.Logs.Endpoint = ""
|
||||
} else {
|
||||
outputs.EnabledOutputs = append(outputs.EnabledOutputs, "OTLPMetrics")
|
||||
fn := func() {
|
||||
if err := shutDownFunc(context.TODO()); err != nil {
|
||||
log.Printf("[ERROR] : OTLP Metrics - Error: %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, "OTLP Metrics", err.Error())
|
||||
}
|
||||
}
|
||||
shutDownFuncs = append(shutDownFuncs, fn)
|
||||
|
@ -854,9 +879,7 @@ func init() {
|
|||
}
|
||||
}
|
||||
|
||||
log.Printf("[INFO] : Falco Sidekick version: %s\n", GetVersionInfo().GitVersion)
|
||||
log.Printf("[INFO] : Enabled Outputs : %s\n", outputs.EnabledOutputs)
|
||||
|
||||
utils.Log(utils.InfoLvl, "", fmt.Sprintf("Enabled Outputs: %s", outputs.EnabledOutputs))
|
||||
}
|
||||
|
||||
func main() {
|
||||
|
@ -864,7 +887,7 @@ func main() {
|
|||
defer shutdown()
|
||||
}
|
||||
if config.Debug {
|
||||
log.Printf("[INFO] : Debug mode : %v", config.Debug)
|
||||
utils.Log(utils.InfoPrefix, "", fmt.Sprintf("Debug mode: %v", config.Debug))
|
||||
}
|
||||
|
||||
routes := map[string]http.Handler{
|
||||
|
@ -886,11 +909,11 @@ func main() {
|
|||
if ok {
|
||||
delete(routes, r)
|
||||
if config.Debug {
|
||||
log.Printf("[DEBUG] : %s is served on http", r)
|
||||
utils.Log(utils.DebugLvl, "", fmt.Sprintf("%s is served on http", r))
|
||||
}
|
||||
HTTPServeMux.Handle(r, handler)
|
||||
} else {
|
||||
log.Printf("[WARN] : tlsserver.notlspaths has unknown path '%s'", r)
|
||||
utils.Log(utils.WarningLvl, "", fmt.Sprintf("tlsserver.notlspaths has unknown path '%s'", r))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -913,12 +936,12 @@ func main() {
|
|||
if config.TLSServer.Deploy {
|
||||
if config.TLSServer.MutualTLS {
|
||||
if config.Debug {
|
||||
log.Printf("[DEBUG] : running mTLS server")
|
||||
utils.Log(utils.DebugLvl, "", "running mTLS server")
|
||||
}
|
||||
|
||||
caCert, err := os.ReadFile(config.TLSServer.CaCertFile)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : %v\n", err.Error())
|
||||
utils.Log(utils.ErrorLvl, "", err.Error())
|
||||
}
|
||||
caCertPool := x509.NewCertPool()
|
||||
caCertPool.AppendCertsFromPEM(caCert)
|
||||
|
@ -932,16 +955,16 @@ func main() {
|
|||
}
|
||||
|
||||
if config.Debug && !config.TLSServer.MutualTLS {
|
||||
log.Printf("[DEBUG] : running TLS server")
|
||||
utils.Log(utils.DebugLvl, "", "running TLS server")
|
||||
}
|
||||
|
||||
if len(config.TLSServer.NoTLSPaths) == 0 {
|
||||
log.Printf("[WARN] : tlsserver.deploy is true but tlsserver.notlspaths is empty, change tlsserver.deploy to true to deploy two servers, at least for /ping endpoint")
|
||||
utils.Log(utils.WarningLvl, "", "tlsserver.deploy is true but tlsserver.notlspaths is empty, change tlsserver.deploy to true to deploy two servers, at least for /ping endpoint")
|
||||
}
|
||||
|
||||
if len(config.TLSServer.NoTLSPaths) != 0 {
|
||||
if config.Debug {
|
||||
log.Printf("[DEBUG] : running HTTP server for endpoints defined in tlsserver.notlspaths")
|
||||
utils.Log(utils.DebugLvl, "", "running HTTP server for endpoints defined in tlsserver.notlspaths")
|
||||
}
|
||||
|
||||
httpServer := &http.Server{
|
||||
|
@ -953,30 +976,31 @@ func main() {
|
|||
WriteTimeout: 60 * time.Second,
|
||||
IdleTimeout: 60 * time.Second,
|
||||
}
|
||||
log.Printf("[INFO] : Falcosidekick is up and listening on %s:%d for TLS and %s:%d for non-TLS", config.ListenAddress, config.ListenPort, config.ListenAddress, config.TLSServer.NoTLSPort)
|
||||
utils.Log(utils.InfoLvl, "", fmt.Sprintf("Falcosidekick is up and listening on %s:%d for TLS and %s:%d for non-TLS", config.ListenAddress, config.ListenPort, config.ListenAddress, config.TLSServer.NoTLSPort))
|
||||
|
||||
errs := make(chan error, 1)
|
||||
go serveTLS(server, errs)
|
||||
go serveHTTP(httpServer, errs)
|
||||
log.Fatal(<-errs)
|
||||
err := <-errs
|
||||
utils.Log(utils.FatalLvl, "", err.Error())
|
||||
} else {
|
||||
log.Printf("[INFO] : Falcosidekick is up and listening on %s:%d", config.ListenAddress, config.ListenPort)
|
||||
utils.Log(utils.InfoLvl, "", fmt.Sprintf("Falcosidekick is up and listening on %s:%d", config.ListenAddress, config.ListenPort))
|
||||
if err := server.ListenAndServeTLS(config.TLSServer.CertFile, config.TLSServer.KeyFile); err != nil {
|
||||
log.Fatalf("[ERROR] : %v", err.Error())
|
||||
utils.Log(utils.FatalLvl, "", err.Error())
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if config.Debug {
|
||||
log.Printf("[DEBUG] : running HTTP server")
|
||||
utils.Log(utils.DebugLvl, "", "running HTTP server")
|
||||
}
|
||||
|
||||
if config.TLSServer.MutualTLS {
|
||||
log.Printf("[WARN] : tlsserver.deploy is false but tlsserver.mutualtls is true, change tlsserver.deploy to true to use mTLS")
|
||||
utils.Log(utils.WarningLvl, "", "tlsserver.deploy is false but tlsserver.mutualtls is true, change tlsserver.deploy to true to use mTLS")
|
||||
}
|
||||
|
||||
log.Printf("[INFO] : Falcosidekick is up and listening on %s:%d", config.ListenAddress, config.ListenPort)
|
||||
utils.Log(utils.InfoLvl, "", fmt.Sprintf("Falcosidekick is up and listening on %s:%d", config.ListenAddress, config.ListenPort))
|
||||
if err := server.ListenAndServe(); err != nil {
|
||||
log.Fatalf("[ERROR] : %v", err.Error())
|
||||
utils.Log(utils.FatalLvl, "", err.Error())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,11 +1,13 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"github.com/falcosecurity/falcosidekick/outputs/otlpmetrics"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
"log"
|
||||
"fmt"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
otlpmetrics "github.com/falcosecurity/falcosidekick/outputs/otlp_metrics"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
func newOTLPMetrics(config *types.Configuration) *otlpmetrics.OTLPMetrics {
|
||||
|
@ -19,14 +21,14 @@ func newOTLPMetrics(config *types.Configuration) *otlpmetrics.OTLPMetrics {
|
|||
|
||||
func newOTLPInputsCounter() otlpmetrics.Counter {
|
||||
supportedAttributes := []string{"source", "status"}
|
||||
name := "falcosidekick_inputs"
|
||||
name := "falcosecurity_falcosidekick_inputs"
|
||||
description := "Number of times an input is received"
|
||||
counter := otlpmetrics.NewCounter(name, description, supportedAttributes)
|
||||
return counter
|
||||
}
|
||||
|
||||
func newOTLPOutputsCounter() otlpmetrics.Counter {
|
||||
name := "falcosidekick_outputs"
|
||||
name := "falcosecurity_falcosidekick_outputs"
|
||||
description := "Number of times an output is generated"
|
||||
supportedAttributes := []string{"destination", "status"}
|
||||
counter := otlpmetrics.NewCounter(name, description, supportedAttributes)
|
||||
|
@ -47,7 +49,7 @@ func newOTLPFalcoMatchesCounter(config *types.Configuration) otlpmetrics.Counter
|
|||
}
|
||||
for i := range config.Customfields {
|
||||
if !regOTLPLabels.MatchString(i) {
|
||||
log.Printf("[ERROR] : Custom field '%v' is not a valid OTLP metric attribute name", i)
|
||||
utils.Log(utils.ErrorLvl, "", fmt.Sprintf("Custom field '%v' is not a valid OTLP metric attribute name", i))
|
||||
continue
|
||||
}
|
||||
supportedAttributes = append(supportedAttributes, i)
|
||||
|
@ -55,7 +57,7 @@ func newOTLPFalcoMatchesCounter(config *types.Configuration) otlpmetrics.Counter
|
|||
|
||||
for _, i := range config.OTLP.Metrics.ExtraAttributesList {
|
||||
if !regOTLPLabels.MatchString(strings.ReplaceAll(i, ".", "_")) {
|
||||
log.Printf("[ERROR] : Extra field '%v' is not a valid OTLP metric attribute name", i)
|
||||
utils.Log(utils.ErrorLvl, "", fmt.Sprintf("Extra field '%v' is not a valid OTLP metric attribute name", i))
|
||||
continue
|
||||
}
|
||||
supportedAttributes = append(supportedAttributes, strings.ReplaceAll(i, ".", "_"))
|
|
@ -5,7 +5,6 @@ package outputs
|
|||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
"regexp"
|
||||
"sort"
|
||||
|
@ -15,6 +14,7 @@ import (
|
|||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -168,7 +168,7 @@ func (c *Client) AlertmanagerPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "alertmanager", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "alertmanager"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : AlertManager - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
185
outputs/aws.go
185
outputs/aws.go
|
@ -4,33 +4,38 @@ package outputs
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/falcosecurity/falcosidekick/outputs/otlpmetrics"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"io"
|
||||
"net/url"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/DataDog/datadog-go/statsd"
|
||||
"github.com/aws/aws-sdk-go/aws"
|
||||
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||
"github.com/aws/aws-sdk-go/aws/credentials"
|
||||
"github.com/aws/aws-sdk-go/aws/ec2metadata"
|
||||
"github.com/aws/aws-sdk-go/aws/session"
|
||||
"github.com/aws/aws-sdk-go/service/cloudwatchlogs"
|
||||
"github.com/aws/aws-sdk-go/service/kinesis"
|
||||
"github.com/aws/aws-sdk-go/service/lambda"
|
||||
"github.com/aws/aws-sdk-go/service/s3"
|
||||
"github.com/aws/aws-sdk-go/service/sns"
|
||||
"github.com/aws/aws-sdk-go/service/sqs"
|
||||
"github.com/aws/aws-sdk-go/service/sts"
|
||||
"github.com/aws/aws-sdk-go-v2/aws"
|
||||
awsconfig "github.com/aws/aws-sdk-go-v2/config"
|
||||
"github.com/aws/aws-sdk-go-v2/credentials"
|
||||
"github.com/aws/aws-sdk-go-v2/feature/ec2/imds"
|
||||
"github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs"
|
||||
cloudwatchlogstypes "github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs/types"
|
||||
"github.com/aws/aws-sdk-go-v2/service/kinesis"
|
||||
"github.com/aws/aws-sdk-go-v2/service/lambda"
|
||||
lambdatypes "github.com/aws/aws-sdk-go-v2/service/lambda/types"
|
||||
"github.com/aws/aws-sdk-go-v2/service/s3"
|
||||
s3types "github.com/aws/aws-sdk-go-v2/service/s3/types"
|
||||
"github.com/aws/aws-sdk-go-v2/service/sns"
|
||||
snstypes "github.com/aws/aws-sdk-go-v2/service/sns/types"
|
||||
"github.com/aws/aws-sdk-go-v2/service/sqs"
|
||||
"github.com/aws/aws-sdk-go-v2/service/sts"
|
||||
"github.com/google/uuid"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
otlpmetrics "github.com/falcosecurity/falcosidekick/outputs/otlp_metrics"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -45,15 +50,28 @@ func NewAWSClient(config *types.Configuration, stats *types.Statistics, promStat
|
|||
} else if os.Getenv("AWS_DEFAULT_REGION") != "" {
|
||||
region = os.Getenv("AWS_DEFAULT_REGION")
|
||||
} else {
|
||||
metaSession := session.Must(session.NewSession())
|
||||
metaClient := ec2metadata.New(metaSession)
|
||||
|
||||
var err error
|
||||
region, err = metaClient.Region()
|
||||
cfg, err := awsconfig.LoadDefaultConfig(context.TODO())
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : AWS - Error while getting region from Metadata AWS Session: %v\n", err.Error())
|
||||
return nil, err
|
||||
}
|
||||
metaClient := imds.NewFromConfig(cfg)
|
||||
|
||||
getMetadataOutput, err := metaClient.GetMetadata(context.TODO(), &imds.GetMetadataInput{Path: "placement/region"})
|
||||
if err != nil {
|
||||
utils.Log(utils.ErrorLvl, "AWS", fmt.Sprintf("Error while calling from Metadata AWS: %v", err.Error()))
|
||||
return nil, errors.New("error calling to get metadata")
|
||||
}
|
||||
|
||||
defer getMetadataOutput.Content.Close()
|
||||
regionBytes, err := io.ReadAll(getMetadataOutput.Content)
|
||||
if err != nil {
|
||||
utils.Log(utils.ErrorLvl, "AWS", fmt.Sprintf("Error while getting region from Metadata AWS Session: %v", err.Error()))
|
||||
return nil, errors.New("error getting region from metadata")
|
||||
}
|
||||
|
||||
region = string(regionBytes)
|
||||
utils.Log(utils.InfoLvl, "AWS", fmt.Sprintf("region from metadata: %s", region))
|
||||
}
|
||||
|
||||
if config.AWS.AccessKeyID != "" && config.AWS.SecretAccessKey != "" && region != "" {
|
||||
|
@ -61,52 +79,45 @@ func NewAWSClient(config *types.Configuration, stats *types.Statistics, promStat
|
|||
err2 := os.Setenv("AWS_SECRET_ACCESS_KEY", config.AWS.SecretAccessKey)
|
||||
err3 := os.Setenv("AWS_DEFAULT_REGION", region)
|
||||
if err1 != nil || err2 != nil || err3 != nil {
|
||||
log.Println("[ERROR] : AWS - Error setting AWS env vars")
|
||||
utils.Log(utils.ErrorLvl, "AWS", "Error setting AWS env vars")
|
||||
return nil, errors.New("error setting AWS env vars")
|
||||
}
|
||||
}
|
||||
|
||||
awscfg := &aws.Config{Region: aws.String(region)}
|
||||
awscfg := &aws.Config{Region: region}
|
||||
|
||||
if config.AWS.RoleARN != "" {
|
||||
baseSess := session.Must(session.NewSession(awscfg))
|
||||
stsSvc := sts.New(baseSess)
|
||||
stsSvc := sts.NewFromConfig(*awscfg)
|
||||
stsArIn := new(sts.AssumeRoleInput)
|
||||
stsArIn.RoleArn = aws.String(config.AWS.RoleARN)
|
||||
stsArIn.RoleSessionName = aws.String(fmt.Sprintf("session-%v", uuid.New().String()))
|
||||
if config.AWS.ExternalID != "" {
|
||||
stsArIn.ExternalId = aws.String(config.AWS.ExternalID)
|
||||
}
|
||||
assumedRole, err := stsSvc.AssumeRole(stsArIn)
|
||||
assumedRole, err := stsSvc.AssumeRole(context.Background(), stsArIn)
|
||||
if err != nil {
|
||||
log.Println("[ERROR] : AWS - Error while Assuming Role")
|
||||
utils.Log(utils.ErrorLvl, "AWS", "Error while Assuming Role")
|
||||
return nil, errors.New("error while assuming role")
|
||||
}
|
||||
awscfg.Credentials = credentials.NewStaticCredentials(
|
||||
awscfg.Credentials = aws.NewCredentialsCache(credentials.NewStaticCredentialsProvider(
|
||||
*assumedRole.Credentials.AccessKeyId,
|
||||
*assumedRole.Credentials.SecretAccessKey,
|
||||
*assumedRole.Credentials.SessionToken,
|
||||
)
|
||||
}
|
||||
|
||||
sess, err := session.NewSession(awscfg)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : AWS - Error while creating AWS Session: %v\n", err.Error())
|
||||
return nil, errors.New("error while creating AWS Session")
|
||||
))
|
||||
}
|
||||
|
||||
if config.AWS.CheckIdentity {
|
||||
_, err = sts.New(sess).GetCallerIdentity(&sts.GetCallerIdentityInput{})
|
||||
_, err := sts.NewFromConfig(*awscfg).GetCallerIdentity(context.Background(), &sts.GetCallerIdentityInput{})
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : AWS - Error while getting AWS Token: %v\n", err.Error())
|
||||
utils.Log(utils.ErrorLvl, "AWS", fmt.Sprintf("Error while getting AWS Token: %v", err.Error()))
|
||||
return nil, errors.New("error while getting AWS Token")
|
||||
}
|
||||
}
|
||||
|
||||
var endpointURL *url.URL
|
||||
endpointURL, err = url.Parse(config.AWS.SQS.URL)
|
||||
endpointURL, err := url.Parse(config.AWS.SQS.URL)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : AWS SQS - %v\n", err.Error())
|
||||
utils.Log(utils.ErrorLvl, "AWS SQS", err.Error())
|
||||
return nil, ErrClientCreation
|
||||
}
|
||||
|
||||
|
@ -114,7 +125,7 @@ func NewAWSClient(config *types.Configuration, stats *types.Statistics, promStat
|
|||
OutputType: "AWS",
|
||||
EndpointURL: endpointURL,
|
||||
Config: config,
|
||||
AWSSession: sess,
|
||||
AWSConfig: awscfg,
|
||||
Stats: stats,
|
||||
PromStats: promStats,
|
||||
OTLPMetrics: otlpMetrics,
|
||||
|
@ -125,36 +136,36 @@ func NewAWSClient(config *types.Configuration, stats *types.Statistics, promStat
|
|||
|
||||
// InvokeLambda invokes a lambda function
|
||||
func (c *Client) InvokeLambda(falcopayload types.FalcoPayload) {
|
||||
svc := lambda.New(c.AWSSession)
|
||||
svc := lambda.NewFromConfig(*c.AWSConfig)
|
||||
|
||||
f, _ := json.Marshal(falcopayload)
|
||||
|
||||
input := &lambda.InvokeInput{
|
||||
FunctionName: aws.String(c.Config.AWS.Lambda.FunctionName),
|
||||
InvocationType: aws.String(c.Config.AWS.Lambda.InvocationType),
|
||||
LogType: aws.String(c.Config.AWS.Lambda.LogType),
|
||||
InvocationType: lambdatypes.InvocationType(c.Config.AWS.Lambda.InvocationType),
|
||||
LogType: lambdatypes.LogType(c.Config.AWS.Lambda.LogType),
|
||||
Payload: f,
|
||||
}
|
||||
|
||||
c.Stats.AWSLambda.Add("total", 1)
|
||||
|
||||
resp, err := svc.Invoke(input)
|
||||
resp, err := svc.Invoke(context.Background(), input)
|
||||
if err != nil {
|
||||
go c.CountMetric("outputs", 1, []string{"output:awslambda", "status:error"})
|
||||
c.Stats.AWSLambda.Add(Error, 1)
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "awslambda", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "awslambda"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : %v Lambda - %v\n", c.OutputType, err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" Lambda", err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
if c.Config.Debug {
|
||||
r, _ := base64.StdEncoding.DecodeString(*resp.LogResult)
|
||||
log.Printf("[DEBUG] : %v Lambda result : %v\n", c.OutputType, string(r))
|
||||
utils.Log(utils.DebugLvl, c.OutputType+" Lambda", fmt.Sprintf("result : %v", string(r)))
|
||||
}
|
||||
|
||||
log.Printf("[INFO] : %v Lambda - Invoke OK (%v)\n", c.OutputType, *resp.StatusCode)
|
||||
utils.Log(utils.InfoLvl, c.OutputType+" Lambda", fmt.Sprintf("Invoke OK (%v)", resp.StatusCode))
|
||||
go c.CountMetric("outputs", 1, []string{"output:awslambda", "status:ok"})
|
||||
c.Stats.AWSLambda.Add("ok", 1)
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "awslambda", "status": "ok"}).Inc()
|
||||
|
@ -164,7 +175,7 @@ func (c *Client) InvokeLambda(falcopayload types.FalcoPayload) {
|
|||
|
||||
// SendMessage sends a message to SQS Queue
|
||||
func (c *Client) SendMessage(falcopayload types.FalcoPayload) {
|
||||
svc := sqs.New(c.AWSSession)
|
||||
svc := sqs.NewFromConfig(*c.AWSConfig)
|
||||
|
||||
f, _ := json.Marshal(falcopayload)
|
||||
|
||||
|
@ -175,22 +186,22 @@ func (c *Client) SendMessage(falcopayload types.FalcoPayload) {
|
|||
|
||||
c.Stats.AWSSQS.Add("total", 1)
|
||||
|
||||
resp, err := svc.SendMessage(input)
|
||||
resp, err := svc.SendMessage(context.Background(), input)
|
||||
if err != nil {
|
||||
go c.CountMetric("outputs", 1, []string{"output:awssqs", "status:error"})
|
||||
c.Stats.AWSSQS.Add(Error, 1)
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "awssqs", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "awssqs"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : %v SQS - %v\n", c.OutputType, err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" SQS", err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
if c.Config.Debug {
|
||||
log.Printf("[DEBUG] : %v SQS - MD5OfMessageBody : %v\n", c.OutputType, *resp.MD5OfMessageBody)
|
||||
utils.Log(utils.DebugLvl, c.OutputType+" SQS", fmt.Sprintf("MD5OfMessageBody : %v", *resp.MD5OfMessageBody))
|
||||
}
|
||||
|
||||
log.Printf("[INFO] : %v SQS - Send Message OK (%v)\n", c.OutputType, *resp.MessageId)
|
||||
utils.Log(utils.InfoLvl, c.OutputType+" SQS", fmt.Sprintf("Send Message OK (%v)", *resp.MessageId))
|
||||
go c.CountMetric("outputs", 1, []string{"output:awssqs", "status:ok"})
|
||||
c.Stats.AWSSQS.Add(OK, 1)
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "awssqs", "status": "ok"}).Inc()
|
||||
|
@ -210,28 +221,31 @@ func (c *Client) UploadS3(falcopayload types.FalcoPayload) {
|
|||
|
||||
key := fmt.Sprintf("%s/%s/%s.json", prefix, t.Format("2006-01-02"), t.Format(time.RFC3339Nano))
|
||||
awsConfig := aws.NewConfig()
|
||||
var client s3.Client
|
||||
if c.Config.AWS.S3.Endpoint != "" {
|
||||
awsConfig = awsConfig.WithEndpoint(c.Config.AWS.S3.Endpoint)
|
||||
s3.NewFromConfig(*awsConfig, s3.WithEndpointResolver(s3.EndpointResolverFromURL(c.Config.AWS.S3.Endpoint)))
|
||||
} else {
|
||||
client = *s3.NewFromConfig(*awsConfig)
|
||||
}
|
||||
resp, err := s3.New(c.AWSSession, awsConfig).PutObject(&s3.PutObjectInput{
|
||||
resp, err := client.PutObject(context.Background(), &s3.PutObjectInput{
|
||||
Bucket: aws.String(c.Config.AWS.S3.Bucket),
|
||||
Key: aws.String(key),
|
||||
Body: bytes.NewReader(f),
|
||||
ACL: aws.String(c.Config.AWS.S3.ObjectCannedACL),
|
||||
ACL: s3types.ObjectCannedACL(c.Config.AWS.S3.ObjectCannedACL),
|
||||
})
|
||||
if err != nil {
|
||||
go c.CountMetric("outputs", 1, []string{"output:awss3", "status:error"})
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "awss3", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "awss3"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : %v S3 - %v\n", c.OutputType, err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" S3", err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
if resp.SSECustomerAlgorithm != nil {
|
||||
log.Printf("[INFO] : %v S3 - Upload payload OK (%v)\n", c.OutputType, *resp.SSECustomerKeyMD5)
|
||||
utils.Log(utils.InfoLvl, c.OutputType+" S3", fmt.Sprintf("Upload payload OK (%v)", *resp.SSECustomerKeyMD5))
|
||||
} else {
|
||||
log.Printf("[INFO] : %v S3 - Upload payload OK\n", c.OutputType)
|
||||
utils.Log(utils.InfoLvl, c.OutputType+" S3", "Upload payload OK")
|
||||
}
|
||||
|
||||
go c.CountMetric("outputs", 1, []string{"output:awss3", "status:ok"})
|
||||
|
@ -242,7 +256,7 @@ func (c *Client) UploadS3(falcopayload types.FalcoPayload) {
|
|||
|
||||
// PublishTopic sends a message to a SNS Topic
|
||||
func (c *Client) PublishTopic(falcopayload types.FalcoPayload) {
|
||||
svc := sns.New(c.AWSSession)
|
||||
svc := sns.NewFromConfig(*c.AWSConfig)
|
||||
|
||||
var msg *sns.PublishInput
|
||||
|
||||
|
@ -255,7 +269,7 @@ func (c *Client) PublishTopic(falcopayload types.FalcoPayload) {
|
|||
} else {
|
||||
msg = &sns.PublishInput{
|
||||
Message: aws.String(falcopayload.Output),
|
||||
MessageAttributes: map[string]*sns.MessageAttributeValue{
|
||||
MessageAttributes: map[string]snstypes.MessageAttributeValue{
|
||||
"priority": {
|
||||
DataType: aws.String("String"),
|
||||
StringValue: aws.String(falcopayload.Priority.String()),
|
||||
|
@ -273,13 +287,13 @@ func (c *Client) PublishTopic(falcopayload types.FalcoPayload) {
|
|||
}
|
||||
|
||||
if len(falcopayload.Tags) != 0 {
|
||||
msg.MessageAttributes["tags"] = &sns.MessageAttributeValue{
|
||||
msg.MessageAttributes["tags"] = snstypes.MessageAttributeValue{
|
||||
DataType: aws.String("String"),
|
||||
StringValue: aws.String(strings.Join(falcopayload.Tags, ",")),
|
||||
}
|
||||
}
|
||||
if falcopayload.Hostname != "" {
|
||||
msg.MessageAttributes[Hostname] = &sns.MessageAttributeValue{
|
||||
msg.MessageAttributes[Hostname] = snstypes.MessageAttributeValue{
|
||||
DataType: aws.String("String"),
|
||||
StringValue: aws.String(falcopayload.Hostname),
|
||||
}
|
||||
|
@ -288,12 +302,12 @@ func (c *Client) PublishTopic(falcopayload types.FalcoPayload) {
|
|||
m := strings.ReplaceAll(strings.ReplaceAll(i, "]", ""), "[", ".")
|
||||
switch j.(type) {
|
||||
case string:
|
||||
msg.MessageAttributes[m] = &sns.MessageAttributeValue{
|
||||
msg.MessageAttributes[m] = snstypes.MessageAttributeValue{
|
||||
DataType: aws.String("String"),
|
||||
StringValue: aws.String(fmt.Sprintf("%v", j)),
|
||||
}
|
||||
case json.Number:
|
||||
msg.MessageAttributes[m] = &sns.MessageAttributeValue{
|
||||
msg.MessageAttributes[m] = snstypes.MessageAttributeValue{
|
||||
DataType: aws.String("Number"),
|
||||
StringValue: aws.String(fmt.Sprintf("%v", j)),
|
||||
}
|
||||
|
@ -305,22 +319,22 @@ func (c *Client) PublishTopic(falcopayload types.FalcoPayload) {
|
|||
|
||||
if c.Config.Debug {
|
||||
p, _ := json.Marshal(msg)
|
||||
log.Printf("[DEBUG] : %v SNS - Message : %v\n", c.OutputType, string(p))
|
||||
utils.Log(utils.DebugLvl, c.OutputType+" SNS", fmt.Sprintf("Message : %v", string(p)))
|
||||
}
|
||||
|
||||
c.Stats.AWSSNS.Add("total", 1)
|
||||
resp, err := svc.Publish(msg)
|
||||
resp, err := svc.Publish(context.TODO(), msg)
|
||||
if err != nil {
|
||||
go c.CountMetric("outputs", 1, []string{"output:awssns", "status:error"})
|
||||
c.Stats.AWSSNS.Add(Error, 1)
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "awssns", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "awssns"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : %v SNS - %v\n", c.OutputType, err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" SNS", err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
log.Printf("[INFO] : %v SNS - Send to topic OK (%v)\n", c.OutputType, *resp.MessageId)
|
||||
utils.Log(utils.DebugLvl, c.OutputType+" SNS", fmt.Sprintf("Send to topic OK (%v)", *resp.MessageId))
|
||||
go c.CountMetric("outputs", 1, []string{"output:awssns", "status:ok"})
|
||||
c.Stats.AWSSNS.Add(OK, 1)
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "awssns", "status": OK}).Inc()
|
||||
|
@ -330,7 +344,7 @@ func (c *Client) PublishTopic(falcopayload types.FalcoPayload) {
|
|||
|
||||
// SendCloudWatchLog sends a message to CloudWatch Log
|
||||
func (c *Client) SendCloudWatchLog(falcopayload types.FalcoPayload) {
|
||||
svc := cloudwatchlogs.New(c.AWSSession)
|
||||
svc := cloudwatchlogs.NewFromConfig(*c.AWSConfig)
|
||||
|
||||
f, _ := json.Marshal(falcopayload)
|
||||
|
||||
|
@ -338,23 +352,24 @@ func (c *Client) SendCloudWatchLog(falcopayload types.FalcoPayload) {
|
|||
|
||||
if c.Config.AWS.CloudWatchLogs.LogStream == "" {
|
||||
streamName := "falcosidekick-logstream"
|
||||
log.Printf("[INFO] : %v CloudWatchLogs - Log Stream not configured creating one called %s\n", c.OutputType, streamName)
|
||||
utils.Log(utils.InfoLvl, c.OutputType+" CloudWatchLogs", fmt.Sprintf("Log Stream not configured creating one called %s", streamName))
|
||||
inputLogStream := &cloudwatchlogs.CreateLogStreamInput{
|
||||
LogGroupName: aws.String(c.Config.AWS.CloudWatchLogs.LogGroup),
|
||||
LogStreamName: aws.String(streamName),
|
||||
}
|
||||
|
||||
_, err := svc.CreateLogStream(inputLogStream)
|
||||
_, err := svc.CreateLogStream(context.Background(), inputLogStream)
|
||||
if err != nil {
|
||||
if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == cloudwatchlogs.ErrCodeResourceAlreadyExistsException {
|
||||
log.Printf("[INFO] : %v CloudWatchLogs - Log Stream %s already exist, reusing...\n", c.OutputType, streamName)
|
||||
var rae *cloudwatchlogstypes.ResourceAlreadyExistsException
|
||||
if errors.As(err, &rae) {
|
||||
utils.Log(utils.InfoLvl, c.OutputType+" CloudWatchLogs", fmt.Sprintf("Log Stream %s already exist, reusing...", streamName))
|
||||
} else {
|
||||
go c.CountMetric("outputs", 1, []string{"output:awscloudwatchlogs", "status:error"})
|
||||
c.Stats.AWSCloudWatchLogs.Add(Error, 1)
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "awscloudwatchlogs", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "awscloudwatchlogs"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : %v CloudWatchLogs - %v\n", c.OutputType, err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" CloudWatchLogs", err.Error())
|
||||
return
|
||||
}
|
||||
}
|
||||
|
@ -362,13 +377,13 @@ func (c *Client) SendCloudWatchLog(falcopayload types.FalcoPayload) {
|
|||
c.Config.AWS.CloudWatchLogs.LogStream = streamName
|
||||
}
|
||||
|
||||
logevent := &cloudwatchlogs.InputLogEvent{
|
||||
logevent := cloudwatchlogstypes.InputLogEvent{
|
||||
Message: aws.String(string(f)),
|
||||
Timestamp: aws.Int64(falcopayload.Time.UnixNano() / int64(time.Millisecond)),
|
||||
}
|
||||
|
||||
input := &cloudwatchlogs.PutLogEventsInput{
|
||||
LogEvents: []*cloudwatchlogs.InputLogEvent{logevent},
|
||||
LogEvents: []cloudwatchlogstypes.InputLogEvent{logevent},
|
||||
LogGroupName: aws.String(c.Config.AWS.CloudWatchLogs.LogGroup),
|
||||
LogStreamName: aws.String(c.Config.AWS.CloudWatchLogs.LogStream),
|
||||
}
|
||||
|
@ -381,11 +396,11 @@ func (c *Client) SendCloudWatchLog(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "awscloudwatchlogs", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "awscloudwatchlogs"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : %v CloudWatchLogs - %v\n", c.OutputType, err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" CloudWatchLogs", err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
log.Printf("[INFO] : %v CloudWatchLogs - Send Log OK (%v)\n", c.OutputType, resp.String())
|
||||
utils.Log(utils.InfoLvl, c.OutputType+" CloudWatchLogs", fmt.Sprintf("Send Log OK (%v)", resp.ResultMetadata))
|
||||
go c.CountMetric("outputs", 1, []string{"output:awscloudwatchlogs", "status:ok"})
|
||||
c.Stats.AWSCloudWatchLogs.Add(OK, 1)
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "awscloudwatchlogs", "status": OK}).Inc()
|
||||
|
@ -394,11 +409,11 @@ func (c *Client) SendCloudWatchLog(falcopayload types.FalcoPayload) {
|
|||
}
|
||||
|
||||
// PutLogEvents will attempt to execute and handle invalid tokens.
|
||||
func (c *Client) putLogEvents(svc *cloudwatchlogs.CloudWatchLogs, input *cloudwatchlogs.PutLogEventsInput) (*cloudwatchlogs.PutLogEventsOutput, error) {
|
||||
resp, err := svc.PutLogEvents(input)
|
||||
func (c *Client) putLogEvents(svc *cloudwatchlogs.Client, input *cloudwatchlogs.PutLogEventsInput) (*cloudwatchlogs.PutLogEventsOutput, error) {
|
||||
resp, err := svc.PutLogEvents(context.Background(), input)
|
||||
if err != nil {
|
||||
if exception, ok := err.(*cloudwatchlogs.InvalidSequenceTokenException); ok {
|
||||
log.Printf("[INFO] : %v Refreshing token for LogGroup: %s LogStream: %s", c.OutputType, *input.LogGroupName, *input.LogStreamName)
|
||||
if exception, ok := err.(*cloudwatchlogstypes.InvalidSequenceTokenException); ok {
|
||||
utils.Log(utils.InfoLvl, c.OutputType+" CloudWatchLogs", fmt.Sprintf("Refreshing token for LogGroup: %s LogStream: %s", *input.LogGroupName, *input.LogStreamName))
|
||||
input.SequenceToken = exception.ExpectedSequenceToken
|
||||
|
||||
return c.putLogEvents(svc, input)
|
||||
|
@ -412,7 +427,7 @@ func (c *Client) putLogEvents(svc *cloudwatchlogs.CloudWatchLogs, input *cloudwa
|
|||
|
||||
// PutRecord puts a record in Kinesis
|
||||
func (c *Client) PutRecord(falcoPayLoad types.FalcoPayload) {
|
||||
svc := kinesis.New(c.AWSSession)
|
||||
svc := kinesis.NewFromConfig(*c.AWSConfig)
|
||||
|
||||
c.Stats.AWSKinesis.Add(Total, 1)
|
||||
|
||||
|
@ -423,18 +438,18 @@ func (c *Client) PutRecord(falcoPayLoad types.FalcoPayload) {
|
|||
StreamName: aws.String(c.Config.AWS.Kinesis.StreamName),
|
||||
}
|
||||
|
||||
resp, err := svc.PutRecord(input)
|
||||
resp, err := svc.PutRecord(context.Background(), input)
|
||||
if err != nil {
|
||||
go c.CountMetric("outputs", 1, []string{"output:awskinesis", "status:error"})
|
||||
c.Stats.AWSKinesis.Add(Error, 1)
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "awskinesis", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "awskinesis"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : %v Kinesis - %v\n", c.OutputType, err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" Kinesis", err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
log.Printf("[INFO] : %v Kinesis - Put Record OK (%v)\n", c.OutputType, resp.SequenceNumber)
|
||||
utils.Log(utils.InfoLvl, c.OutputType+" Kinesis", fmt.Sprintf("Put Record OK (%v)", resp.SequenceNumber))
|
||||
go c.CountMetric("outputs", 1, []string{"output:awskinesis", "status:ok"})
|
||||
c.Stats.AWSKinesis.Add(OK, 1)
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "awskinesis", "status": "ok"}).Inc()
|
||||
|
|
|
@ -7,18 +7,19 @@ import (
|
|||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"io"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"github.com/aws/aws-sdk-go/aws"
|
||||
"github.com/aws/aws-sdk-go/service/s3"
|
||||
"github.com/aws/aws-sdk-go-v2/aws"
|
||||
"github.com/aws/aws-sdk-go-v2/service/s3"
|
||||
s3types "github.com/aws/aws-sdk-go-v2/service/s3/types"
|
||||
"github.com/embano1/memlog"
|
||||
"github.com/google/uuid"
|
||||
"github.com/xitongsys/parquet-go-source/mem"
|
||||
"github.com/xitongsys/parquet-go/writer"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -206,10 +207,10 @@ func (c *Client) EnqueueSecurityLake(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "awssecuritylake.", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "awssecuritylake"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : %v SecurityLake - %v\n", c.OutputType, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" SecurityLake", err.Error())
|
||||
return
|
||||
}
|
||||
log.Printf("[INFO] : %v SecurityLake - Event queued (%v)\n", c.OutputType, falcopayload.UUID)
|
||||
utils.Log(utils.InfoLvl, c.OutputType+" SecurityLake", fmt.Sprintf("Event queued (%v)", falcopayload.UUID))
|
||||
*c.Config.AWS.SecurityLake.WriteOffset = offset
|
||||
}
|
||||
|
||||
|
@ -238,7 +239,7 @@ func (c *Client) processNextBatch() error {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "awssecuritylake.", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "awssecuritylake"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : %v SecurityLake - %v\n", c.OutputType, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" SecurityLake", err.Error())
|
||||
// ctx currently not handled in main
|
||||
// https://github.com/falcosecurity/falcosidekick/pull/390#discussion_r1081690326
|
||||
return err
|
||||
|
@ -259,7 +260,7 @@ func (c *Client) processNextBatch() error {
|
|||
earliest,
|
||||
err,
|
||||
)
|
||||
log.Printf("[ERROR] : %v SecurityLake - %v\n", c.OutputType, msg)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" SecurityLake", msg.Error())
|
||||
awslake.ReadOffset = &earliest
|
||||
return err
|
||||
}
|
||||
|
@ -271,7 +272,7 @@ func (c *Client) processNextBatch() error {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "awssecuritylake.", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "awssecuritylake"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : %v SecurityLake - %v\n", c.OutputType, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" SecurityLake", err.Error())
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
@ -308,50 +309,51 @@ func (c *Client) writeParquet(uid string, records []memlog.Record) error {
|
|||
key := fmt.Sprintf("/%s/region=%s/accountId=%s/eventDay=%s/%s.parquet", c.Config.AWS.SecurityLake.Prefix, c.Config.AWS.SecurityLake.Region, c.Config.AWS.SecurityLake.AccountID, t.Format("20060102"), uid)
|
||||
ctx, cancelFn := context.WithTimeout(context.Background(), 10*time.Second)
|
||||
defer cancelFn()
|
||||
resp, err := s3.New(c.AWSSession).PutObjectWithContext(ctx, &s3.PutObjectInput{
|
||||
|
||||
resp, err := s3.NewFromConfig(*c.AWSConfig).PutObject(ctx, &s3.PutObjectInput{
|
||||
Bucket: aws.String(c.Config.AWS.SecurityLake.Bucket),
|
||||
Key: aws.String(key),
|
||||
Body: aws.ReadSeekCloser(r),
|
||||
Body: r,
|
||||
ContentType: aws.String("Apache Parquet"),
|
||||
ACL: aws.String(s3.ObjectCannedACLBucketOwnerFullControl),
|
||||
ACL: s3types.ObjectCannedACLBucketOwnerFullControl,
|
||||
})
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : %v SecurityLake - Upload parquet file %s.parquet Failed: %v\n", c.OutputType, uid, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" SecurityLake", fmt.Sprintf("Upload parquet file %s.parquet Failed: %v", uid, err))
|
||||
return err
|
||||
}
|
||||
if resp.SSECustomerAlgorithm != nil {
|
||||
log.Printf("[INFO] : %v SecurityLake - Upload parquet file %s.parquet OK (%v) (%v events) \n", c.OutputType, uid, *resp.SSECustomerKeyMD5, len(records))
|
||||
utils.Log(utils.InfoLvl, c.OutputType+" SecurityLake", fmt.Sprintf("Upload parquet file %s.parquet OK (%v) (%v events)", uid, *resp.SSECustomerKeyMD5, len(records)))
|
||||
} else {
|
||||
log.Printf("[INFO] : %v SecurityLake - Upload parquet file %s.parquet OK (%v events)\n", c.OutputType, uid, len(records))
|
||||
utils.Log(utils.InfoLvl, c.OutputType+" SecurityLake", fmt.Sprintf("Upload parquet file %s.parquet OK (%v events)\n", uid, len(records)))
|
||||
}
|
||||
return nil
|
||||
})
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : %v SecurityLake - Can't create the parquet file %s.parquet: %v\n", c.OutputType, uid, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" SecurityLake", fmt.Sprintf("Can't create the parquet file %s.parquet: %v", uid, err))
|
||||
return err
|
||||
}
|
||||
pw, err := writer.NewParquetWriter(fw, new(OCSFSecurityFinding), 10)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : %v SecurityLake - Can't create the parquet writer: %v\n", c.OutputType, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" SecurityLake", fmt.Sprintf("Can't create the parquet writer: %v", err))
|
||||
return err
|
||||
}
|
||||
for _, i := range records {
|
||||
var f types.FalcoPayload
|
||||
if err := json.Unmarshal(i.Data, &f); err != nil {
|
||||
log.Printf("[ERROR] : %v SecurityLake - Unmarshalling error: %v\n", c.OutputType, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" SecurityLake", fmt.Sprintf("Unmarshalling error: %v", err))
|
||||
continue
|
||||
}
|
||||
o := NewOCSFSecurityFinding(f)
|
||||
if err = pw.Write(o); err != nil {
|
||||
log.Printf("[ERROR] : %v SecurityLake - Parquet writer error: %v\n", c.OutputType, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" SecurityLake", fmt.Sprintf("Parquet writer error: %v", err))
|
||||
continue
|
||||
}
|
||||
}
|
||||
if err = pw.WriteStop(); err != nil {
|
||||
log.Printf("[ERROR] : %v SecurityLake - Can't stop the parquet writer: %v\n", c.OutputType, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" SecurityLake", fmt.Sprintf("Can't stop the parquet writer: %v", err))
|
||||
}
|
||||
if err = fw.Close(); err != nil {
|
||||
log.Printf("[ERROR] : %v SecurityLake - Can't close the parquet file %s.parquet: %v\n", c.OutputType, uid, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" SecurityLake", fmt.Sprintf("Can't close the parquet file %s.parquet: %v", uid, err))
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
|
|
|
@ -5,15 +5,16 @@ package outputs
|
|||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"github.com/falcosecurity/falcosidekick/outputs/otlpmetrics"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
|
||||
azeventhubs "github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs"
|
||||
"github.com/DataDog/datadog-go/statsd"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
otlpmetrics "github.com/falcosecurity/falcosidekick/outputs/otlp_metrics"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -38,48 +39,48 @@ func (c *Client) EventHubPost(falcopayload types.FalcoPayload) {
|
|||
ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second)
|
||||
defer cancel()
|
||||
|
||||
log.Printf("[INFO] : %v EventHub - Try sending event", c.OutputType)
|
||||
utils.Log(utils.InfoLvl, c.OutputType+" EventHub", "Try sending event")
|
||||
defaultAzureCred, err := azidentity.NewDefaultAzureCredential(nil)
|
||||
if err != nil {
|
||||
c.setEventHubErrorMetrics()
|
||||
log.Printf("[ERROR] : %v EventHub - %v\n", c.OutputType, err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" EventHub", err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
producerClient, err := azeventhubs.NewProducerClient(c.Config.Azure.EventHub.Namespace, c.Config.Azure.EventHub.Name, defaultAzureCred, nil)
|
||||
if err != nil {
|
||||
c.setEventHubErrorMetrics()
|
||||
log.Printf("[ERROR] : %v EventHub - %v\n", c.OutputType, err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" EventHub", err.Error())
|
||||
return
|
||||
}
|
||||
defer producerClient.Close(ctx)
|
||||
|
||||
log.Printf("[INFO] : %v EventHub - Hub client created\n", c.OutputType)
|
||||
utils.Log(utils.InfoLvl, c.OutputType+" EventHub", "Hub client created")
|
||||
|
||||
data, err := json.Marshal(falcopayload)
|
||||
if err != nil {
|
||||
c.setEventHubErrorMetrics()
|
||||
log.Printf("[ERROR] : Cannot marshal payload: %v", err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" EventHub", fmt.Sprintf("Cannot marshal payload: %v", err))
|
||||
return
|
||||
}
|
||||
|
||||
batch, err := producerClient.NewEventDataBatch(ctx, nil)
|
||||
if err != nil {
|
||||
c.setEventHubErrorMetrics()
|
||||
log.Printf("[ERROR] : Cannot marshal payload: %v", err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" EventHub", fmt.Sprintf("Cannot marshal payload: %v", err))
|
||||
return
|
||||
}
|
||||
|
||||
if err := batch.AddEventData(&azeventhubs.EventData{Body: data}, nil); err != nil {
|
||||
c.setEventHubErrorMetrics()
|
||||
log.Printf("[ERROR] : Cannot marshal payload: %v", err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" EventHub", fmt.Sprintf("Cannot marshal payload: %v", err))
|
||||
return
|
||||
}
|
||||
|
||||
producerClient.SendEventDataBatch(ctx, batch, nil)
|
||||
if err := producerClient.SendEventDataBatch(ctx, batch, nil); err != nil {
|
||||
c.setEventHubErrorMetrics()
|
||||
log.Printf("[ERROR] : %v EventHub - %v\n", c.OutputType, err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" EventHub", err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -89,7 +90,7 @@ func (c *Client) EventHubPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "azureeventhub", "status": OK}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "azureeventhub"),
|
||||
attribute.String("status", OK)).Inc()
|
||||
log.Printf("[INFO] : %v EventHub - Publish OK", c.OutputType)
|
||||
utils.Log(utils.InfoLvl, c.OutputType+" EventHub", "Publish OK")
|
||||
}
|
||||
|
||||
// setEventHubErrorMetrics set the error stats
|
||||
|
|
|
@ -11,10 +11,8 @@ import (
|
|||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/falcosecurity/falcosidekick/outputs/otlpmetrics"
|
||||
"github.com/segmentio/kafka-go"
|
||||
"io"
|
||||
"log"
|
||||
"log/slog"
|
||||
"math"
|
||||
"net/http"
|
||||
"net/url"
|
||||
|
@ -23,25 +21,26 @@ import (
|
|||
"strings"
|
||||
"sync"
|
||||
|
||||
"golang.org/x/sync/semaphore"
|
||||
crdClient "sigs.k8s.io/wg-policy-prototypes/policy-report/pkg/generated/v1alpha2/clientset/versioned"
|
||||
|
||||
gcpfunctions "cloud.google.com/go/functions/apiv1"
|
||||
amqp "github.com/rabbitmq/amqp091-go"
|
||||
wavefront "github.com/wavefronthq/wavefront-sdk-go/senders"
|
||||
|
||||
"cloud.google.com/go/pubsub"
|
||||
"cloud.google.com/go/storage"
|
||||
"github.com/DataDog/datadog-go/statsd"
|
||||
"github.com/aws/aws-sdk-go/aws/session"
|
||||
"github.com/aws/aws-sdk-go-v2/aws"
|
||||
cloudevents "github.com/cloudevents/sdk-go/v2"
|
||||
"k8s.io/client-go/kubernetes"
|
||||
|
||||
mqtt "github.com/eclipse/paho.mqtt.golang"
|
||||
timescaledb "github.com/jackc/pgx/v5/pgxpool"
|
||||
amqp "github.com/rabbitmq/amqp091-go"
|
||||
redis "github.com/redis/go-redis/v9"
|
||||
"github.com/segmentio/kafka-go"
|
||||
logstash "github.com/telkomdev/go-stash"
|
||||
wavefront "github.com/wavefronthq/wavefront-sdk-go/senders"
|
||||
"golang.org/x/sync/semaphore"
|
||||
"k8s.io/client-go/kubernetes"
|
||||
crdClient "sigs.k8s.io/wg-policy-prototypes/policy-report/pkg/generated/v1alpha2/clientset/versioned"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/batcher"
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
otlpmetrics "github.com/falcosecurity/falcosidekick/outputs/otlp_metrics"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -96,6 +95,9 @@ const MutualTLSCacertFilename = "/ca.crt"
|
|||
const HttpPost = "POST"
|
||||
const HttpPut = "PUT"
|
||||
|
||||
// Protocol
|
||||
const GRPC = "grpc"
|
||||
|
||||
// Client communicates with the different API.
|
||||
type Client struct {
|
||||
OutputType string
|
||||
|
@ -109,7 +111,7 @@ type Client struct {
|
|||
Stats *types.Statistics
|
||||
PromStats *types.PromStatistics
|
||||
OTLPMetrics *otlpmetrics.OTLPMetrics
|
||||
AWSSession *session.Session
|
||||
AWSConfig *aws.Config
|
||||
StatsdClient *statsd.Client
|
||||
DogstatsdClient *statsd.Client
|
||||
GCPTopicClient *pubsub.Topic
|
||||
|
@ -125,6 +127,8 @@ type Client struct {
|
|||
MQTTClient mqtt.Client
|
||||
TimescaleDBClient *timescaledb.Pool
|
||||
RedisClient *redis.Client
|
||||
OTLPLogsLogger *slog.Logger
|
||||
LogstashClient *logstash.Stash
|
||||
|
||||
// Enable gzip compression
|
||||
EnableCompression bool
|
||||
|
@ -151,16 +155,16 @@ type Client struct {
|
|||
func NewClient(outputType string, defaultEndpointURL string, cfg types.CommonConfig, params types.InitClientArgs) (*Client, error) {
|
||||
reg := regexp.MustCompile(`(http|nats)(s?)://.*`)
|
||||
if !reg.MatchString(defaultEndpointURL) {
|
||||
log.Printf("[ERROR] : %v - %v\n", outputType, "Bad Endpoint")
|
||||
utils.Log(utils.ErrorLvl, outputType, "Bad Endpoint")
|
||||
return nil, ErrClientCreation
|
||||
}
|
||||
if _, err := url.ParseRequestURI(defaultEndpointURL); err != nil {
|
||||
log.Printf("[ERROR] : %v - %v\n", outputType, err.Error())
|
||||
utils.Log(utils.ErrorLvl, outputType, err.Error())
|
||||
return nil, ErrClientCreation
|
||||
}
|
||||
endpointURL, err := url.Parse(defaultEndpointURL)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : %v - %v\n", outputType, err.Error())
|
||||
utils.Log(utils.ErrorLvl, outputType, err.Error())
|
||||
return nil, ErrClientCreation
|
||||
}
|
||||
return &Client{
|
||||
|
@ -211,7 +215,7 @@ func (c *Client) getInlinedBodyAsString(resp *http.Response) string {
|
|||
if contentEncoding == "gzip" {
|
||||
dec, err := decompressData(body)
|
||||
if err != nil {
|
||||
log.Printf("[INFO] : %v - Failed to decompress response: %v", c.OutputType, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("Failed to decompress response: %v", err))
|
||||
return ""
|
||||
}
|
||||
body = dec
|
||||
|
@ -267,10 +271,10 @@ func (c *Client) sendRequest(method string, payload interface{}, responseBody *s
|
|||
c.initOnce.Do(func() {
|
||||
if c.cfg.MaxConcurrentRequests == 0 {
|
||||
c.sem = semaphore.NewWeighted(math.MaxInt64)
|
||||
log.Printf("[INFO] : %v - Max concurrent requests: unlimited", c.OutputType)
|
||||
utils.Log(utils.InfoLvl, c.OutputType, "Max concurrent requests: unlimited")
|
||||
} else {
|
||||
c.sem = semaphore.NewWeighted(int64(c.cfg.MaxConcurrentRequests))
|
||||
log.Printf("[INFO] : %v - Max concurrent requests: %v", c.OutputType, c.cfg.MaxConcurrentRequests)
|
||||
utils.Log(utils.InfoLvl, c.OutputType, fmt.Sprintf("Max concurrent requests: %v", c.cfg.MaxConcurrentRequests))
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -278,7 +282,7 @@ func (c *Client) sendRequest(method string, payload interface{}, responseBody *s
|
|||
defer func(c *Client) {
|
||||
if err := recover(); err != nil {
|
||||
go c.CountMetric("outputs", 1, []string{"output:" + strings.ToLower(c.OutputType), "status:connectionrefused"})
|
||||
log.Printf("[ERROR] : %v - %s", c.OutputType, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprint(err))
|
||||
}
|
||||
}(c)
|
||||
|
||||
|
@ -288,18 +292,18 @@ func (c *Client) sendRequest(method string, payload interface{}, responseBody *s
|
|||
case influxdbPayload:
|
||||
fmt.Fprintf(body, "%v", payload)
|
||||
if c.Config.Debug {
|
||||
log.Printf("[DEBUG] : %v payload : %v\n", c.OutputType, body)
|
||||
utils.Log(utils.DebugLvl, c.OutputType, fmt.Sprintf("payload : %v", body))
|
||||
}
|
||||
case spyderbatPayload:
|
||||
zipper := gzip.NewWriter(body)
|
||||
if err := json.NewEncoder(zipper).Encode(payload); err != nil {
|
||||
log.Printf("[ERROR] : %v - %s", c.OutputType, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
}
|
||||
zipper.Close()
|
||||
if c.Config.Debug {
|
||||
debugBody := new(bytes.Buffer)
|
||||
if err := json.NewEncoder(debugBody).Encode(payload); err == nil {
|
||||
log.Printf("[DEBUG] : %v payload : %v\n", c.OutputType, debugBody)
|
||||
utils.Log(utils.DebugLvl, c.OutputType, fmt.Sprintf("payload : %v", body))
|
||||
}
|
||||
}
|
||||
case io.Reader:
|
||||
|
@ -308,17 +312,17 @@ func (c *Client) sendRequest(method string, payload interface{}, responseBody *s
|
|||
reader = bytes.NewBuffer(v)
|
||||
default:
|
||||
if err := json.NewEncoder(body).Encode(payload); err != nil {
|
||||
log.Printf("[ERROR] : %v - %s", c.OutputType, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
}
|
||||
if c.Config.Debug {
|
||||
log.Printf("[DEBUG] : %v payload : %v\n", c.OutputType, body)
|
||||
utils.Log(utils.DebugLvl, c.OutputType, fmt.Sprintf("payload : %v", body))
|
||||
}
|
||||
}
|
||||
|
||||
if c.EnableCompression {
|
||||
data, err := compressData(reader)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : %v - Failed to compress data: %v\n", c.OutputType, err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("Failed to compress data: %v", err))
|
||||
return err
|
||||
}
|
||||
reader = bytes.NewBuffer(data)
|
||||
|
@ -334,7 +338,7 @@ func (c *Client) sendRequest(method string, payload interface{}, responseBody *s
|
|||
req, err = http.NewRequest(method, c.EndpointURL.String(), reader)
|
||||
}
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : %v - %v\n", c.OutputType, err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return err
|
||||
}
|
||||
|
||||
|
@ -358,14 +362,14 @@ func (c *Client) sendRequest(method string, payload interface{}, responseBody *s
|
|||
ctx := context.Background()
|
||||
err = c.sem.Acquire(ctx, 1)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : %v - %v\n", c.OutputType, err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return err
|
||||
}
|
||||
defer c.sem.Release(1)
|
||||
|
||||
resp, err := client.Do(req)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : %v - %v\n", c.OutputType, err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
go c.CountMetric("outputs", 1, []string{"output:" + strings.ToLower(c.OutputType), "status:connectionrefused"})
|
||||
return err
|
||||
}
|
||||
|
@ -376,7 +380,7 @@ func (c *Client) sendRequest(method string, payload interface{}, responseBody *s
|
|||
|
||||
switch resp.StatusCode {
|
||||
case http.StatusOK, http.StatusCreated, http.StatusAccepted, http.StatusNoContent: //200, 201, 202, 204
|
||||
log.Printf("[INFO] : %v - %v OK (%v)\n", c.OutputType, method, resp.StatusCode)
|
||||
utils.Log(utils.InfoLvl, c.OutputType, fmt.Sprintf("%v OK (%v)", method, resp.StatusCode))
|
||||
ot := c.OutputType
|
||||
logResponse := ot == Kubeless || ot == Openfaas || ot == Fission
|
||||
if responseBody != nil || logResponse {
|
||||
|
@ -388,42 +392,42 @@ func (c *Client) sendRequest(method string, payload interface{}, responseBody *s
|
|||
*responseBody = s
|
||||
}
|
||||
if logResponse {
|
||||
log.Printf("[INFO] : %v - Function Response : %s\n", ot, s)
|
||||
utils.Log(utils.InfoLvl, ot, fmt.Sprintf("Function Response : %s", s))
|
||||
}
|
||||
}
|
||||
return nil
|
||||
case http.StatusBadRequest: //400
|
||||
msg := c.getInlinedBodyAsString(resp)
|
||||
log.Printf("[ERROR] : %v - %v (%v): %s\n", c.OutputType, ErrHeaderMissing, resp.StatusCode, msg)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("%v (%v): %s", ErrHeaderMissing, resp.StatusCode, msg))
|
||||
if msg != "" {
|
||||
return errors.New(msg)
|
||||
}
|
||||
return ErrHeaderMissing
|
||||
case http.StatusUnauthorized: //401
|
||||
log.Printf("[ERROR] : %v - %v (%v): %s\n", c.OutputType, ErrClientAuthenticationError, resp.StatusCode, c.getInlinedBodyAsString(resp))
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("%v (%v): %s", ErrClientAuthenticationError, resp.StatusCode, c.getInlinedBodyAsString(resp)))
|
||||
return ErrClientAuthenticationError
|
||||
case http.StatusForbidden: //403
|
||||
log.Printf("[ERROR] : %v - %v (%v): %s\n", c.OutputType, ErrForbidden, resp.StatusCode, c.getInlinedBodyAsString(resp))
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("%v (%v): %s", ErrForbidden, resp.StatusCode, c.getInlinedBodyAsString(resp)))
|
||||
return ErrForbidden
|
||||
case http.StatusNotFound: //404
|
||||
log.Printf("[ERROR] : %v - %v (%v): %s\n", c.OutputType, ErrNotFound, resp.StatusCode, c.getInlinedBodyAsString(resp))
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("%v (%v): %s", ErrNotFound, resp.StatusCode, c.getInlinedBodyAsString(resp)))
|
||||
return ErrNotFound
|
||||
case http.StatusUnprocessableEntity: //422
|
||||
log.Printf("[ERROR] : %v - %v (%v): %s\n", c.OutputType, ErrUnprocessableEntityError, resp.StatusCode, c.getInlinedBodyAsString(resp))
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("%v (%v): %s", ErrUnprocessableEntityError, resp.StatusCode, c.getInlinedBodyAsString(resp)))
|
||||
return ErrUnprocessableEntityError
|
||||
case http.StatusTooManyRequests: //429
|
||||
log.Printf("[ERROR] : %v - %v (%v): %s\n", c.OutputType, ErrTooManyRequest, resp.StatusCode, c.getInlinedBodyAsString(resp))
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("%v (%v): %s", ErrTooManyRequest, resp.StatusCode, c.getInlinedBodyAsString(resp)))
|
||||
return ErrTooManyRequest
|
||||
case http.StatusInternalServerError: //500
|
||||
log.Printf("[ERROR] : %v - %v (%v)\n", c.OutputType, ErrTooManyRequest, resp.StatusCode)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("%v (%v)", ErrTooManyRequest, resp.StatusCode))
|
||||
return ErrInternalServer
|
||||
case http.StatusBadGateway: //502
|
||||
msg := c.getInlinedBodyAsString(resp)
|
||||
fmt.Println(msg)
|
||||
log.Printf("[ERROR] : %v - %v (%v)\n", c.OutputType, ErrTooManyRequest, resp.StatusCode)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("%v (%v)", ErrTooManyRequest, resp.StatusCode))
|
||||
return ErrBadGateway
|
||||
default:
|
||||
log.Printf("[ERROR] : %v - unexpected Response (%v)\n", c.OutputType, resp.StatusCode)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("unexpected Response (%v)", resp.StatusCode))
|
||||
return errors.New(resp.Status)
|
||||
}
|
||||
}
|
||||
|
@ -444,7 +448,7 @@ func (c *Client) httpClient() *http.Client {
|
|||
Transport: customTransport,
|
||||
}
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : %v - %v\n", c.OutputType, err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
} else {
|
||||
c.httpcli = client // cache the client instance for future http calls
|
||||
}
|
||||
|
|
|
@ -5,10 +5,11 @@ package outputs
|
|||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -18,7 +19,7 @@ import (
|
|||
const (
|
||||
tableSlideType = "table"
|
||||
textSlideType = "text"
|
||||
botName = "Falco Sidekick"
|
||||
botName = "Falcosidekick"
|
||||
)
|
||||
|
||||
// Table slide fields
|
||||
|
@ -79,7 +80,7 @@ func newCliqPayload(falcopayload types.FalcoPayload, config *types.Configuration
|
|||
if config.Cliq.MessageFormatTemplate != nil {
|
||||
buf := &bytes.Buffer{}
|
||||
if err := config.Cliq.MessageFormatTemplate.Execute(buf, falcopayload); err != nil {
|
||||
log.Printf("[ERROR] : Cliq - Error expanding Cliq message %v", err)
|
||||
utils.Log(utils.ErrorLvl, "Cliq", fmt.Sprintf("Error expanding Cliq message: %v", err))
|
||||
} else {
|
||||
payload.Text = buf.String()
|
||||
|
||||
|
@ -175,7 +176,7 @@ func (c *Client) CliqPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "cliq", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "cliq"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Cliq - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@ func TestNewCliqPayload(t *testing.T) {
|
|||
expectedOutput := cliqPayload{
|
||||
Text: "\U000026AA Rule: Test rule Priority: Debug",
|
||||
Bot: cliqBot{
|
||||
Name: "Falco Sidekick",
|
||||
Name: "Falcosidekick",
|
||||
Image: DefaultIconURL,
|
||||
},
|
||||
Slides: []cliqSlide{
|
||||
|
|
|
@ -4,11 +4,13 @@ package outputs
|
|||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
|
||||
cloudevents "github.com/cloudevents/sdk-go/v2"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -24,7 +26,7 @@ func (c *Client) CloudEventsSend(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "cloudevents", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "cloudevents"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : CloudEvents - NewDefaultClient : %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("NewDefaultClient : %v", err))
|
||||
return
|
||||
}
|
||||
c.CloudEventsClient = client
|
||||
|
@ -50,7 +52,7 @@ func (c *Client) CloudEventsSend(falcopayload types.FalcoPayload) {
|
|||
}
|
||||
|
||||
if err := event.SetData(cloudevents.ApplicationJSON, falcopayload); err != nil {
|
||||
log.Printf("[ERROR] : CloudEvents, failed to set data : %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("failed to set data : %v", err))
|
||||
}
|
||||
|
||||
if result := c.CloudEventsClient.Send(ctx, event); cloudevents.IsUndelivered(result) {
|
||||
|
@ -59,7 +61,7 @@ func (c *Client) CloudEventsSend(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "cloudevents", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "cloudevents"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : CloudEvents - %v\n", result)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("%v", result))
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -69,5 +71,5 @@ func (c *Client) CloudEventsSend(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "cloudevents", "status": OK}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "cloudevents"),
|
||||
attribute.String("status", OK)).Inc()
|
||||
log.Printf("[INFO] : CloudEvents - Send OK\n")
|
||||
utils.Log(utils.InfoLvl, c.OutputType, "Send OK")
|
||||
}
|
||||
|
|
|
@ -4,10 +4,11 @@ package outputs
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"sort"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -72,7 +73,7 @@ func (c *Client) DatadogPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "datadog", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "datadog"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Datadog - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -3,12 +3,14 @@
|
|||
package outputs
|
||||
|
||||
import (
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"net/http"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
const (
|
||||
|
@ -61,7 +63,7 @@ func (c *Client) DatadogLogsPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "datadoglogs", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "datadoglogs"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Datadog Logs - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -4,11 +4,12 @@ package outputs
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -108,7 +109,7 @@ func (c *Client) DiscordPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "discord", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "discord"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Discord - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -3,13 +3,14 @@
|
|||
package outputs
|
||||
|
||||
import (
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"net/http"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -125,7 +126,7 @@ func (c *Client) DynatracePost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "dynatrace", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "dynatrace"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Dynatrace - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -7,9 +7,9 @@ import (
|
|||
"strconv"
|
||||
"testing"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
func TestNewDynatracePayload(t *testing.T) {
|
||||
|
|
|
@ -6,15 +6,16 @@ import (
|
|||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"regexp"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/batcher"
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -49,7 +50,7 @@ func NewElasticsearchClient(params types.InitClientArgs) (*Client, error) {
|
|||
}
|
||||
|
||||
if esCfg.Batching.Enabled {
|
||||
log.Printf("[INFO] : %v - Batching enabled: %v max bytes, %v interval\n", c.OutputType, esCfg.Batching.BatchSize, esCfg.Batching.FlushInterval)
|
||||
utils.Log(utils.InfoLvl, c.OutputType, fmt.Sprintf("Batching enabled: %v max bytes, %v interval", esCfg.Batching.BatchSize, esCfg.Batching.FlushInterval))
|
||||
callbackFn := func(falcoPayloads []types.FalcoPayload, data []byte) {
|
||||
go c.elasticsearchPost("", data, falcoPayloads...)
|
||||
}
|
||||
|
@ -62,7 +63,7 @@ func NewElasticsearchClient(params types.InitClientArgs) (*Client, error) {
|
|||
}
|
||||
if esCfg.EnableCompression {
|
||||
c.EnableCompression = true
|
||||
log.Printf("[INFO] : %v - Compression enabled\n", c.OutputType)
|
||||
utils.Log(utils.InfoLvl, c.OutputType, "Compression enabled")
|
||||
}
|
||||
|
||||
return c, nil
|
||||
|
@ -76,7 +77,7 @@ func (c *Client) ElasticsearchPost(falcopayload types.FalcoPayload) {
|
|||
|
||||
payload, err := c.marshalESPayload(falcopayload)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : %v - Failed to marshal payload: %v\n", c.OutputType, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("Failed to marshal payload: %v", err))
|
||||
}
|
||||
|
||||
c.elasticsearchPost(c.getIndex(), payload, falcopayload)
|
||||
|
@ -99,7 +100,7 @@ func (c *Client) elasticsearchPost(index string, payload []byte, falcoPayloads .
|
|||
endpointURL, err := url.Parse(eURL)
|
||||
if err != nil {
|
||||
c.setElasticSearchErrorMetrics(sz)
|
||||
log.Printf("[ERROR] : %v - %v\n", c.OutputType, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -157,7 +158,7 @@ func (c *Client) elasticsearchPost(index string, payload []byte, falcoPayloads .
|
|||
return
|
||||
}
|
||||
if len(resp.Items) != len(falcoPayloads) {
|
||||
log.Printf("[ERROR] : %v - mismatched %v responses with %v request payloads\n", c.OutputType, len(resp.Items), len(falcoPayloads))
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("mismatched %v responses with %v request payloads", len(resp.Items), len(falcoPayloads)))
|
||||
c.setElasticSearchErrorMetrics(sz)
|
||||
return
|
||||
}
|
||||
|
@ -207,7 +208,7 @@ func (c *Client) elasticsearchPost(index string, payload []byte, falcoPayloads .
|
|||
delete(payload.OutputFields, i)
|
||||
}
|
||||
}
|
||||
log.Printf("[INFO] : %v - %v\n", c.OutputType, "attempt to POST again the payload without the wrong field")
|
||||
utils.Log(utils.InfoLvl, c.OutputType, "attempt to POST again the payload without the wrong field")
|
||||
err = c.Post(payload, reqOpts...)
|
||||
if err != nil {
|
||||
c.setElasticSearchErrorMetrics(sz)
|
||||
|
@ -229,11 +230,11 @@ func (c *Client) ElasticsearchCreateIndexTemplate(config types.ElasticsearchOutp
|
|||
d := c
|
||||
indexExists, err := c.isIndexTemplateExist(config)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : %v - %v\n", c.OutputType, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return err
|
||||
}
|
||||
if indexExists {
|
||||
log.Printf("[INFO] : %v - %v\n", c.OutputType, "Index template already exists")
|
||||
utils.Log(utils.InfoLvl, c.OutputType, "Index template already exists")
|
||||
return nil
|
||||
}
|
||||
|
||||
|
@ -247,16 +248,16 @@ func (c *Client) ElasticsearchCreateIndexTemplate(config types.ElasticsearchOutp
|
|||
m = strings.ReplaceAll(m, "${REPLICAS}", fmt.Sprintf("%v", config.NumberOfReplicas))
|
||||
j := make(map[string]interface{})
|
||||
if err := json.Unmarshal([]byte(m), &j); err != nil {
|
||||
log.Printf("[ERROR] : %v - %v\n", c.OutputType, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return err
|
||||
}
|
||||
// create the index template by PUT
|
||||
if d.Put(j) != nil {
|
||||
log.Printf("[ERROR] : %v - %v\n", c.OutputType, err)
|
||||
if err := d.Put(j); err != nil {
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return err
|
||||
}
|
||||
|
||||
log.Printf("[INFO] : %v - %v\n", c.OutputType, "Index template created")
|
||||
utils.Log(utils.InfoLvl, c.OutputType, "Index template created")
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
|
@ -6,17 +6,17 @@ import (
|
|||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/falcosecurity/falcosidekick/outputs/otlpmetrics"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/DataDog/datadog-go/statsd"
|
||||
"github.com/google/uuid"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"k8s.io/client-go/kubernetes"
|
||||
"k8s.io/client-go/tools/clientcmd"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
otlpmetrics "github.com/falcosecurity/falcosidekick/outputs/otlp_metrics"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -29,7 +29,7 @@ const ServicesPath = "/services/"
|
|||
|
||||
// NewFissionClient returns a new output.Client for accessing Kubernetes.
|
||||
func NewFissionClient(config *types.Configuration, stats *types.Statistics, promStats *types.PromStatistics,
|
||||
oltpMetrics *otlpmetrics.OTLPMetrics, statsdClient, dogstatsdClient *statsd.Client) (*Client, error) {
|
||||
otlpMetrics *otlpmetrics.OTLPMetrics, statsdClient, dogstatsdClient *statsd.Client) (*Client, error) {
|
||||
if config.Fission.KubeConfig != "" {
|
||||
restConfig, err := clientcmd.BuildConfigFromFlags("", config.Fission.KubeConfig)
|
||||
if err != nil {
|
||||
|
@ -44,7 +44,7 @@ func NewFissionClient(config *types.Configuration, stats *types.Statistics, prom
|
|||
Config: config,
|
||||
Stats: stats,
|
||||
PromStats: promStats,
|
||||
OTLPMetrics: oltpMetrics,
|
||||
OTLPMetrics: otlpMetrics,
|
||||
StatsdClient: statsdClient,
|
||||
DogstatsdClient: dogstatsdClient,
|
||||
KubernetesClient: clientset,
|
||||
|
@ -86,10 +86,10 @@ func (c *Client) FissionCall(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "Fission", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "Fission"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : %s - %v\n", Fission, err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
log.Printf("[INFO] : %s - Function Response : %v\n", Fission, string(rawbody))
|
||||
utils.Log(utils.InfoLvl, c.OutputType, fmt.Sprintf("Function Response : %v", string(rawbody)))
|
||||
} else {
|
||||
c.ContentType = FissionContentType
|
||||
|
||||
|
@ -102,11 +102,11 @@ func (c *Client) FissionCall(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "Fission", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "Fission"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : %s - %v\n", Fission, err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
}
|
||||
log.Printf("[INFO] : %s - Call Function \"%v\" OK\n", Fission, c.Config.Fission.Function)
|
||||
utils.Log(utils.InfoLvl, c.OutputType, fmt.Sprintf("Call Function \"%v\" OK", c.Config.Fission.Function))
|
||||
go c.CountMetric(Outputs, 1, []string{"output:Fission", "status:ok"})
|
||||
c.Stats.Fission.Add(OK, 1)
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "Fission", "status": OK}).Inc()
|
||||
|
|
|
@ -8,21 +8,20 @@ import (
|
|||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/falcosecurity/falcosidekick/outputs/otlpmetrics"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
gcpfunctions "cloud.google.com/go/functions/apiv1"
|
||||
"cloud.google.com/go/storage"
|
||||
gcpfunctionspb "google.golang.org/genproto/googleapis/cloud/functions/v1"
|
||||
|
||||
"cloud.google.com/go/pubsub"
|
||||
"cloud.google.com/go/storage"
|
||||
"github.com/DataDog/datadog-go/statsd"
|
||||
"github.com/googleapis/gax-go/v2"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"golang.org/x/oauth2/google"
|
||||
"google.golang.org/api/option"
|
||||
gcpfunctionspb "google.golang.org/genproto/googleapis/cloud/functions/v1"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
otlpmetrics "github.com/falcosecurity/falcosidekick/outputs/otlp_metrics"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -31,7 +30,7 @@ func NewGCPClient(config *types.Configuration, stats *types.Statistics, promStat
|
|||
otlpMetrics *otlpmetrics.OTLPMetrics, statsdClient, dogstatsdClient *statsd.Client) (*Client, error) {
|
||||
base64decodedCredentialsData, err := base64.StdEncoding.DecodeString(config.GCP.Credentials)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : GCP - %v\n", "Error while base64-decoding GCP Credentials")
|
||||
utils.Log(utils.ErrorLvl, "GCP", "Erroc.OutputTyper while base64-decoding GCP Credentials")
|
||||
return nil, errors.New("error while base64-decoding GCP Credentials")
|
||||
}
|
||||
|
||||
|
@ -44,19 +43,19 @@ func NewGCPClient(config *types.Configuration, stats *types.Statistics, promStat
|
|||
if googleCredentialsData != "" {
|
||||
credentials, err := google.CredentialsFromJSON(context.Background(), []byte(googleCredentialsData), pubsub.ScopePubSub)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : GCP PubSub - %v\n", "Error while loading GCP Credentials")
|
||||
utils.Log(utils.ErrorLvl, "GCP PubSub", "Error while loading GCP Credentials")
|
||||
return nil, errors.New("error while loading GCP Credentials")
|
||||
}
|
||||
pubSubClient, err := pubsub.NewClient(context.Background(), config.GCP.PubSub.ProjectID, option.WithCredentials(credentials))
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : GCP PubSub - %v\n", "Error while creating GCP PubSub Client")
|
||||
utils.Log(utils.ErrorLvl, "GCP PubSub", "Error while creating GCP PubSub Client")
|
||||
return nil, errors.New("error while creating GCP PubSub Client")
|
||||
}
|
||||
topicClient = pubSubClient.Topic(config.GCP.PubSub.Topic)
|
||||
} else {
|
||||
pubSubClient, err := pubsub.NewClient(context.Background(), config.GCP.PubSub.ProjectID)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : GCP PubSub - %v\n", "Error while creating GCP PubSub Client")
|
||||
utils.Log(utils.ErrorLvl, "GCP PubSub", "Error while creating GCP PubSub Client")
|
||||
return nil, errors.New("error while creating GCP PubSub Client")
|
||||
}
|
||||
topicClient = pubSubClient.Topic(config.GCP.PubSub.Topic)
|
||||
|
@ -64,14 +63,14 @@ func NewGCPClient(config *types.Configuration, stats *types.Statistics, promStat
|
|||
}
|
||||
|
||||
if config.GCP.Storage.Bucket != "" {
|
||||
credentials, err := google.CredentialsFromJSON(context.Background(), []byte(googleCredentialsData))
|
||||
credentials, err := google.CredentialsFromJSON(context.Background(), []byte(googleCredentialsData), storage.ScopeReadWrite)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : GCP Storage - %v\n", "Error while loading GCS Credentials")
|
||||
utils.Log(utils.ErrorLvl, "GCP PubSub", "Error while loading GCS Credentials")
|
||||
return nil, errors.New("error while loading GCP Credentials")
|
||||
}
|
||||
storageClient, err = storage.NewClient(context.Background(), option.WithCredentials(credentials))
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : GCP Storage - %v\n", "Error while creating GCP Storage Client")
|
||||
utils.Log(utils.ErrorLvl, "GCP PubSub", "Error while creating GCP Storage Client")
|
||||
return nil, errors.New("error while creating GCP Storage Client")
|
||||
}
|
||||
}
|
||||
|
@ -80,18 +79,18 @@ func NewGCPClient(config *types.Configuration, stats *types.Statistics, promStat
|
|||
if googleCredentialsData != "" {
|
||||
credentials, err := google.CredentialsFromJSON(context.Background(), []byte(googleCredentialsData), gcpfunctions.DefaultAuthScopes()...)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : GCP CloudFunctions - %v\n", "Error while loading GCS Credentials")
|
||||
utils.Log(utils.ErrorLvl, "GCP CloudFunctions", "Error while loading GCS Credentials")
|
||||
return nil, errors.New("error while loading GCP Credentials")
|
||||
}
|
||||
cloudFunctionsClient, err = gcpfunctions.NewCloudFunctionsClient(context.Background(), option.WithCredentials(credentials))
|
||||
if err != nil {
|
||||
log.Printf("[ERROR]: GCP CloudFunctions - %v\n", "Error while creating GCP CloudFunctions Client")
|
||||
utils.Log(utils.ErrorLvl, "GCP CloudFunctions", "Error while creating GCP CloudFunctions Client")
|
||||
return nil, errors.New("error while creating GCP CloudFunctions Client")
|
||||
}
|
||||
} else {
|
||||
cloudFunctionsClient, err = gcpfunctions.NewCloudFunctionsClient(context.Background())
|
||||
if err != nil {
|
||||
log.Printf("[ERROR]: GCP CloudFunctions - %v\n", "Error while creating GCP CloudFunctions Client")
|
||||
utils.Log(utils.ErrorLvl, "GCP CloudFunctions", "Error while creating GCP CloudFunctions Client")
|
||||
return nil, errors.New("error while creating GCP CloudFunctions Client")
|
||||
}
|
||||
}
|
||||
|
@ -124,7 +123,7 @@ func (c *Client) GCPCallCloudFunction(falcopayload types.FalcoPayload) {
|
|||
}, gax.WithGRPCOptions())
|
||||
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : GCPCloudFunctions - %v - %v\n", "Error while calling CloudFunction", err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" CloudFunctions", fmt.Sprintf("Error while calling CloudFunction: %v", err))
|
||||
c.Stats.GCPPubSub.Add(Error, 1)
|
||||
go c.CountMetric("outputs", 1, []string{"output:gcpcloudfunctions", "status:error"})
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "gcpcloudfunctions", "status": Error}).Inc()
|
||||
|
@ -133,7 +132,7 @@ func (c *Client) GCPCallCloudFunction(falcopayload types.FalcoPayload) {
|
|||
return
|
||||
}
|
||||
|
||||
log.Printf("[INFO] : GCPCloudFunctions - Call CloudFunction OK (%v)\n", result.ExecutionId)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" CloudFunctions", fmt.Sprintf("Call CloudFunction OK (%v)", result.ExecutionId))
|
||||
c.Stats.GCPCloudFunctions.Add(OK, 1)
|
||||
go c.CountMetric("outputs", 1, []string{"output:gcpcloudfunctions", "status:ok"})
|
||||
|
||||
|
@ -152,7 +151,7 @@ func (c *Client) GCPPublishTopic(falcopayload types.FalcoPayload) {
|
|||
result := c.GCPTopicClient.Publish(context.Background(), message)
|
||||
id, err := result.Get(context.Background())
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : GCPPubSub - %v - %v\n", "Error while publishing message", err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" PubSub", fmt.Sprintf("Error while publishing message: %v", err))
|
||||
c.Stats.GCPPubSub.Add(Error, 1)
|
||||
go c.CountMetric("outputs", 1, []string{"output:gcppubsub", "status:error"})
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "gcppubsub", "status": Error}).Inc()
|
||||
|
@ -161,7 +160,7 @@ func (c *Client) GCPPublishTopic(falcopayload types.FalcoPayload) {
|
|||
return
|
||||
}
|
||||
|
||||
log.Printf("[INFO] : GCPPubSub - Send to topic OK (%v)\n", id)
|
||||
utils.Log(utils.InfoLvl, c.OutputType+" PubSub", fmt.Sprintf("Send to topic OK (%v)", id))
|
||||
c.Stats.GCPPubSub.Add(OK, 1)
|
||||
go c.CountMetric("outputs", 1, []string{"output:gcppubsub", "status:ok"})
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "gcppubsub", "status": OK}).Inc()
|
||||
|
@ -185,7 +184,7 @@ func (c *Client) UploadGCS(falcopayload types.FalcoPayload) {
|
|||
bucketWriter := c.GCSStorageClient.Bucket(c.Config.GCP.Storage.Bucket).Object(key).NewWriter(context.Background())
|
||||
n, err := bucketWriter.Write(payload)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : GCPStorage - %v - %v\n", "Error while Uploading message", err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+"Storage", fmt.Sprintf("Error while Uploading message: %v", err))
|
||||
c.Stats.GCPStorage.Add(Error, 1)
|
||||
go c.CountMetric("outputs", 1, []string{"output:gcpstorage", "status:error"})
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "gcpstorage", "status": Error}).Inc()
|
||||
|
@ -194,7 +193,7 @@ func (c *Client) UploadGCS(falcopayload types.FalcoPayload) {
|
|||
return
|
||||
}
|
||||
if n == 0 {
|
||||
log.Printf("[ERROR] : GCPStorage - %v\n", "Empty payload uploaded")
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+"Storage", "Empty payload uploaded")
|
||||
c.Stats.GCPStorage.Add(Error, 1)
|
||||
go c.CountMetric("outputs", 1, []string{"output:gcpstorage", "status:error"})
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "gcpstorage", "status": Error}).Inc()
|
||||
|
@ -203,7 +202,7 @@ func (c *Client) UploadGCS(falcopayload types.FalcoPayload) {
|
|||
return
|
||||
}
|
||||
if err := bucketWriter.Close(); err != nil {
|
||||
log.Printf("[ERROR] : GCPStorage - %v - %v\n", "Error while closing the writer", err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+"Storage", fmt.Sprintf("Error while closing the writer: %v", err))
|
||||
c.Stats.GCPStorage.Add(Error, 1)
|
||||
go c.CountMetric("outputs", 1, []string{"output:gcpstorage", "status:error"})
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "gcpstorage", "status": Error}).Inc()
|
||||
|
@ -212,7 +211,7 @@ func (c *Client) UploadGCS(falcopayload types.FalcoPayload) {
|
|||
return
|
||||
}
|
||||
|
||||
log.Printf("[INFO] : GCPStorage - Upload to bucket OK \n")
|
||||
utils.Log(utils.InfoLvl, c.OutputType+"Storage", "Upload to bucket OK")
|
||||
c.Stats.GCPStorage.Add(OK, 1)
|
||||
go c.CountMetric("outputs", 1, []string{"output:gcpstorage", "status:ok"})
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "gcpstorage", "status": OK}).Inc()
|
||||
|
|
|
@ -3,10 +3,11 @@
|
|||
package outputs
|
||||
|
||||
import (
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -25,7 +26,7 @@ func (c *Client) CloudRunFunctionPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "gcpcloudrun", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "gcpcloudrun"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : GCPCloudRun - %v\n", err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+"CloudRun", err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -4,11 +4,13 @@ package outputs
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"fmt"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -47,7 +49,7 @@ func newGooglechatPayload(falcopayload types.FalcoPayload, config *types.Configu
|
|||
if config.Googlechat.MessageFormatTemplate != nil {
|
||||
buf := &bytes.Buffer{}
|
||||
if err := config.Googlechat.MessageFormatTemplate.Execute(buf, falcopayload); err != nil {
|
||||
log.Printf("[ERROR] : GoogleChat - Error expanding Google Chat message %v", err)
|
||||
utils.Log(utils.ErrorLvl, "GoogleChat", fmt.Sprintf("Error expanding Google Chat message: %v", err))
|
||||
} else {
|
||||
messageText = buf.String()
|
||||
}
|
||||
|
@ -110,7 +112,7 @@ func (c *Client) GooglechatPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "googlechat", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "googlechat"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : GoogleChat - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -5,12 +5,13 @@ package outputs
|
|||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"net/http"
|
||||
"strings"
|
||||
textTemplate "text/template"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -75,7 +76,7 @@ func newGotifyPayload(falcopayload types.FalcoPayload, config *types.Configurati
|
|||
err = ttmpl.Execute(&outtext, falcopayload)
|
||||
}
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : Gotify - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, "Gotify", err.Error())
|
||||
return g
|
||||
}
|
||||
|
||||
|
@ -102,7 +103,7 @@ func (c *Client) GotifyPost(falcopayload types.FalcoPayload) {
|
|||
})
|
||||
if err != nil {
|
||||
c.setGotifyErrorMetrics()
|
||||
log.Printf("[ERROR] : Gotify - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, "Gotify", err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -4,10 +4,11 @@ package outputs
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -93,7 +94,7 @@ func (c *Client) GrafanaPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "grafana", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "grafana"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Grafana - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -121,7 +122,7 @@ func (c *Client) GrafanaOnCallPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "grafanaoncall", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "grafanaoncall"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Grafana OnCall - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -3,11 +3,12 @@
|
|||
package outputs
|
||||
|
||||
import (
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -55,7 +56,7 @@ func (c *Client) InfluxdbPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "influxdb", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "influxdb"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : InfluxDB - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -8,9 +8,6 @@ import (
|
|||
"crypto/x509"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/falcosecurity/falcosidekick/outputs/otlpmetrics"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"net"
|
||||
"strings"
|
||||
"time"
|
||||
|
@ -19,7 +16,10 @@ import (
|
|||
"github.com/segmentio/kafka-go"
|
||||
"github.com/segmentio/kafka-go/sasl/plain"
|
||||
"github.com/segmentio/kafka-go/sasl/scram"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
otlpmetrics "github.com/falcosecurity/falcosidekick/outputs/otlp_metrics"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -39,7 +39,7 @@ func NewKafkaClient(config *types.Configuration, stats *types.Statistics, promSt
|
|||
caCertPool, err := x509.SystemCertPool()
|
||||
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : Kafka - failed to initialize root CAs: %v", err)
|
||||
utils.Log(utils.ErrorLvl, "Kafka", fmt.Sprintf("failed to initialize root CAs: %v", err))
|
||||
}
|
||||
|
||||
transport.TLS = &tls.Config{
|
||||
|
@ -76,7 +76,7 @@ func NewKafkaClient(config *types.Configuration, stats *types.Statistics, promSt
|
|||
}
|
||||
}
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : Kafka - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, "Kafka", err.Error())
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
@ -102,7 +102,7 @@ func NewKafkaClient(config *types.Configuration, stats *types.Statistics, promSt
|
|||
case "round_robin":
|
||||
kafkaWriter.Balancer = &kafka.RoundRobin{}
|
||||
default:
|
||||
log.Printf("[ERROR] : Kafka - unsupported balancer %q\n", config.Kafka.Balancer)
|
||||
utils.Log(utils.ErrorLvl, "Kafka", fmt.Sprintf("unsupported balancer %q", config.Kafka.Balancer))
|
||||
return nil, fmt.Errorf("unsupported balancer %q", config.Kafka.Balancer)
|
||||
}
|
||||
|
||||
|
@ -118,7 +118,7 @@ func NewKafkaClient(config *types.Configuration, stats *types.Statistics, promSt
|
|||
case "NONE":
|
||||
// leave as default, none
|
||||
default:
|
||||
log.Printf("[ERROR] : Kafka - unsupported compression %q\n", config.Kafka.Compression)
|
||||
utils.Log(utils.ErrorLvl, "Kafka", fmt.Sprintf("unsupported compression %q", config.Kafka.Compression))
|
||||
return nil, fmt.Errorf("unsupported compression %q", config.Kafka.Compression)
|
||||
}
|
||||
|
||||
|
@ -130,7 +130,7 @@ func NewKafkaClient(config *types.Configuration, stats *types.Statistics, promSt
|
|||
case "NONE":
|
||||
kafkaWriter.RequiredAcks = kafka.RequireNone
|
||||
default:
|
||||
log.Printf("[ERROR] : Kafka - unsupported required ACKs %q\n", config.Kafka.RequiredACKs)
|
||||
utils.Log(utils.ErrorLvl, "Kafka", fmt.Sprintf("unsupported required ACKs %q", config.Kafka.RequiredACKs))
|
||||
return nil, fmt.Errorf("unsupported required ACKs %q", config.Kafka.RequiredACKs)
|
||||
}
|
||||
|
||||
|
@ -155,7 +155,7 @@ func (c *Client) KafkaProduce(falcopayload types.FalcoPayload) {
|
|||
falcoMsg, err := json.Marshal(falcopayload)
|
||||
if err != nil {
|
||||
c.incrKafkaErrorMetrics(1)
|
||||
log.Printf("[ERROR] : Kafka - %v - %v\n", "failed to marshalling message", err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("failed to marshalling message: %v", err))
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -167,11 +167,11 @@ func (c *Client) KafkaProduce(falcopayload types.FalcoPayload) {
|
|||
err = c.KafkaProducer.WriteMessages(context.Background(), kafkaMsg)
|
||||
if err != nil {
|
||||
c.incrKafkaErrorMetrics(1)
|
||||
log.Printf("[ERROR] : Kafka - %v\n", err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
} else {
|
||||
c.incrKafkaSuccessMetrics(1)
|
||||
log.Printf("[INFO] : Kafka - Publish OK\n")
|
||||
utils.Log(utils.InfoLvl, c.OutputType, "Publish OK")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -179,10 +179,10 @@ func (c *Client) KafkaProduce(falcopayload types.FalcoPayload) {
|
|||
func (c *Client) handleKafkaCompletion(messages []kafka.Message, err error) {
|
||||
if err != nil {
|
||||
c.incrKafkaErrorMetrics(len(messages))
|
||||
log.Printf("[ERROR] : Kafka (%d) - %v\n", len(messages), err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("(%d) %v", len(messages), err))
|
||||
} else {
|
||||
c.incrKafkaSuccessMetrics(len(messages))
|
||||
log.Printf("[INFO] : Kafka (%d) - Publish OK\n", len(messages))
|
||||
utils.Log(utils.InfoLvl, c.OutputType, fmt.Sprintf("(%d) - Publish OK", len(messages)))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -6,9 +6,10 @@ import (
|
|||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -41,7 +42,7 @@ func (c *Client) KafkaRestPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "kafkarest", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "kafkarest"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Kafka Rest - %v - %v\n", "failed to marshalling message", err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("failed to marshalling message: %v", err))
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -60,7 +61,7 @@ func (c *Client) KafkaRestPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "kafkarest", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "kafkarest"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Kafka Rest - %v\n", err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -6,17 +6,17 @@ import (
|
|||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/falcosecurity/falcosidekick/outputs/otlpmetrics"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/DataDog/datadog-go/statsd"
|
||||
"github.com/google/uuid"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"k8s.io/client-go/kubernetes"
|
||||
"k8s.io/client-go/tools/clientcmd"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
otlpmetrics "github.com/falcosecurity/falcosidekick/outputs/otlp_metrics"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -87,10 +87,10 @@ func (c *Client) KubelessCall(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "kubeless", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "kubeless"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Kubeless - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
log.Printf("[INFO] : Kubeless - Function Response : %v\n", string(rawbody))
|
||||
utils.Log(utils.InfoLvl, c.OutputType, fmt.Sprintf("Function Response : %v", string(rawbody)))
|
||||
} else {
|
||||
c.ContentType = KubelessContentType
|
||||
|
||||
|
@ -105,11 +105,11 @@ func (c *Client) KubelessCall(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "kubeless", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "kubeless"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Kubeless - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
}
|
||||
log.Printf("[INFO] : Kubeless - Call Function \"%v\" OK\n", c.Config.Kubeless.Function)
|
||||
utils.Log(utils.InfoLvl, c.OutputType, fmt.Sprintf("Call Function \"%v\" OK", c.Config.Kubeless.Function))
|
||||
go c.CountMetric(Outputs, 1, []string{"output:kubeless", "status:ok"})
|
||||
c.Stats.Kubeless.Add(OK, 1)
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "kubeless", "status": OK}).Inc()
|
||||
|
|
|
@ -0,0 +1,149 @@
|
|||
// SPDX-License-Identifier: MIT OR Apache-2.0
|
||||
|
||||
package outputs
|
||||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"crypto/x509"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"os"
|
||||
"regexp"
|
||||
|
||||
"github.com/DataDog/datadog-go/statsd"
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
"github.com/telkomdev/go-stash"
|
||||
)
|
||||
|
||||
/*
|
||||
Logstash throws a jsonparse error if keys contain an index, e.g., "key[0]".
|
||||
This function is meant to get rid of the index brackets format in favor of dots.
|
||||
For the previous example, the "key[0]" value will be replaced by "key.0".
|
||||
*/
|
||||
func replaceKeysWithIndexes(data map[string]interface{}) map[string]interface{} {
|
||||
newData := make(map[string]interface{})
|
||||
re := regexp.MustCompile(`\[(\d+)\]`)
|
||||
|
||||
for key, value := range data {
|
||||
newKey := re.ReplaceAllStringFunc(key, func(match string) string {
|
||||
return "." + re.FindStringSubmatch(match)[1]
|
||||
})
|
||||
|
||||
// Recursively process nested maps
|
||||
if nestedMap, ok := value.(map[string]interface{}); ok {
|
||||
newData[newKey] = replaceKeysWithIndexes(nestedMap)
|
||||
} else {
|
||||
newData[newKey] = value
|
||||
}
|
||||
}
|
||||
return newData
|
||||
}
|
||||
|
||||
func firstValid(paths []string) string {
|
||||
for _, path := range paths {
|
||||
if _, err := os.Stat(path); err == nil {
|
||||
return path
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func NewLogstashClient(config *types.Configuration, stats *types.Statistics, promStats *types.PromStatistics,
|
||||
statsdClient, dogstatsdClient *statsd.Client) (*Client, error) {
|
||||
var tlsCfg *tls.Config
|
||||
|
||||
if mTLS := config.Logstash.MutualTLS; mTLS {
|
||||
// Get certificates
|
||||
var MutualTLSClientCertPath, MutualTLSClientKeyPath, MutualTLSClientCaCertPath string
|
||||
|
||||
MutualTLSClientCertPath = firstValid([]string{config.Logstash.CertFile, config.MutualTLSClient.CertFile, config.MutualTLSFilesPath + "/client.crt"})
|
||||
MutualTLSClientKeyPath = firstValid([]string{config.Logstash.KeyFile, config.MutualTLSClient.KeyFile, config.MutualTLSFilesPath + "/client.key"})
|
||||
MutualTLSClientCaCertPath = firstValid([]string{config.Logstash.CaCertFile, config.MutualTLSClient.CaCertFile, config.MutualTLSFilesPath + "/ca.crt"})
|
||||
|
||||
cert, err := tls.LoadX509KeyPair(MutualTLSClientCertPath, MutualTLSClientKeyPath)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("failed to load logstash SSL certificate: %w", err)
|
||||
utils.Log(utils.ErrorLvl, "Logstash", err.Error())
|
||||
return nil, err
|
||||
}
|
||||
|
||||
caCert, err := os.ReadFile(MutualTLSClientCaCertPath)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("failed to load logstash SSL CA certificate: %w", err)
|
||||
utils.Log(utils.ErrorLvl, "Logstash", err.Error())
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Configure TLS
|
||||
|
||||
pool, err := x509.SystemCertPool()
|
||||
if err != nil {
|
||||
pool = x509.NewCertPool()
|
||||
}
|
||||
|
||||
tlsCfg = &tls.Config{
|
||||
MinVersion: tls.VersionTLS12,
|
||||
Certificates: []tls.Certificate{cert},
|
||||
RootCAs: pool,
|
||||
}
|
||||
tlsCfg.RootCAs.AppendCertsFromPEM(caCert)
|
||||
|
||||
} else {
|
||||
// The check cert flag and mutual tls are mutually exclusive
|
||||
if !config.Logstash.CheckCert {
|
||||
tlsCfg = &tls.Config{
|
||||
InsecureSkipVerify: true, // #nosec G402 This is only set as a result of explicit configuration
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
lClient, err := stash.Connect(config.Logstash.Address, config.Logstash.Port, stash.SetTLSConfig(tlsCfg), stash.SetTLS(config.Logstash.TLS || config.Logstash.MutualTLS))
|
||||
|
||||
if err != nil {
|
||||
err = fmt.Errorf("misconfiguration, cannot connect to the logstash server: %w", err)
|
||||
utils.Log(utils.ErrorLvl, "Logstash", err.Error())
|
||||
return nil, err
|
||||
}
|
||||
utils.Log(utils.InfoLvl, "Logstash", "connected to logstash server")
|
||||
|
||||
return &Client{
|
||||
OutputType: "Logstash",
|
||||
Config: config,
|
||||
LogstashClient: lClient,
|
||||
Stats: stats,
|
||||
PromStats: promStats,
|
||||
StatsdClient: statsdClient,
|
||||
DogstatsdClient: dogstatsdClient,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (c *Client) LogstashPost(falcopayload types.FalcoPayload) {
|
||||
status := OK
|
||||
loglevel := utils.InfoLvl
|
||||
c.Stats.Logstash.Add(Total, 1)
|
||||
|
||||
falcopayload.OutputFields = replaceKeysWithIndexes(falcopayload.OutputFields)
|
||||
|
||||
falcopayload.Tags = append(falcopayload.Tags, c.Config.Logstash.Tags...)
|
||||
logstashPayload, err := json.Marshal(falcopayload)
|
||||
if err != nil {
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("failed to marshal falcopayload: %v", err))
|
||||
|
||||
c.Stats.Logstash.Add(Error, 1)
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "logstash", "status": Error}).Inc()
|
||||
return
|
||||
}
|
||||
|
||||
n, err := c.LogstashClient.Write(logstashPayload)
|
||||
if err != nil {
|
||||
status = Error
|
||||
loglevel = utils.ErrorLvl
|
||||
}
|
||||
|
||||
c.Stats.Logstash.Add(status, 1)
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "logstash", "status": status}).Inc()
|
||||
go c.CountMetric(Outputs, 1, []string{"output:logstash", fmt.Sprintf("status:%v", status)})
|
||||
|
||||
utils.Log(loglevel, c.OutputType, fmt.Sprintf("output.logstash status=%v (%v)", status, n))
|
||||
}
|
|
@ -4,15 +4,18 @@ package outputs
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"net/http"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
const LokiOut string = "Loki"
|
||||
|
||||
type lokiPayload struct {
|
||||
Streams []lokiStream `json:"streams"`
|
||||
}
|
||||
|
@ -28,22 +31,34 @@ type lokiValue = []string
|
|||
const LokiContentType = "application/json"
|
||||
|
||||
func newLokiPayload(falcopayload types.FalcoPayload, config *types.Configuration) lokiPayload {
|
||||
s := make(map[string]string, 3+len(falcopayload.OutputFields)+len(config.Loki.ExtraLabelsList)+len(falcopayload.Tags))
|
||||
s := make(map[string]string)
|
||||
s["rule"] = falcopayload.Rule
|
||||
s["source"] = falcopayload.Source
|
||||
s["priority"] = falcopayload.Priority.String()
|
||||
|
||||
if k8sNs, ok := falcopayload.OutputFields["k8s.ns.name"].(string); ok {
|
||||
s["k8s_ns_name"] = k8sNs
|
||||
}
|
||||
if k8sPod, ok := falcopayload.OutputFields["k8s.pod.name"].(string); ok {
|
||||
s["k8s_pod_name"] = k8sPod
|
||||
}
|
||||
|
||||
for i, j := range falcopayload.OutputFields {
|
||||
switch v := j.(type) {
|
||||
case string:
|
||||
for k := range config.Customfields {
|
||||
if i == k {
|
||||
s[strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll(i, ".", ""), "]", ""), "[", "")] = strings.ReplaceAll(v, "\"", "")
|
||||
s[strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll(i, ".", "_"), "]", ""), "[", "")] = strings.ReplaceAll(v, "\"", "")
|
||||
}
|
||||
}
|
||||
for k := range config.Templatedfields {
|
||||
if i == k {
|
||||
s[strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll(i, ".", "_"), "]", ""), "[", "")] = strings.ReplaceAll(v, "\"", "")
|
||||
}
|
||||
}
|
||||
for _, k := range config.Loki.ExtraLabelsList {
|
||||
if i == k {
|
||||
s[strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll(i, ".", ""), "]", ""), "[", "")] = strings.ReplaceAll(v, "\"", "")
|
||||
s[strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll(i, ".", "_"), "]", ""), "[", "")] = strings.ReplaceAll(v, "\"", "")
|
||||
}
|
||||
}
|
||||
default:
|
||||
|
@ -60,10 +75,17 @@ func newLokiPayload(falcopayload types.FalcoPayload, config *types.Configuration
|
|||
s["tags"] = strings.Join(falcopayload.Tags, ",")
|
||||
}
|
||||
|
||||
var v string
|
||||
if config.Loki.Format == "json" {
|
||||
v = falcopayload.String()
|
||||
} else {
|
||||
v = falcopayload.Output
|
||||
}
|
||||
|
||||
return lokiPayload{Streams: []lokiStream{
|
||||
{
|
||||
Stream: s,
|
||||
Values: []lokiValue{[]string{fmt.Sprintf("%v", falcopayload.Time.UnixNano()), falcopayload.Output}},
|
||||
Values: []lokiValue{[]string{fmt.Sprintf("%v", falcopayload.Time.UnixNano()), v}},
|
||||
},
|
||||
}}
|
||||
}
|
||||
|
@ -103,7 +125,7 @@ func (c *Client) LokiPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "loki", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "loki"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Loki - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, LokiOut, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -4,11 +4,13 @@ package outputs
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"fmt"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -79,7 +81,7 @@ func newMattermostPayload(falcopayload types.FalcoPayload, config *types.Configu
|
|||
if config.Mattermost.MessageFormatTemplate != nil {
|
||||
buf := &bytes.Buffer{}
|
||||
if err := config.Mattermost.MessageFormatTemplate.Execute(buf, falcopayload); err != nil {
|
||||
log.Printf("[ERROR] : Mattermost - Error expanding Mattermost message %v", err)
|
||||
utils.Log(utils.ErrorLvl, "Mattermost", fmt.Sprintf("Error expanding Mattermost message %v", err))
|
||||
} else {
|
||||
messageText = buf.String()
|
||||
}
|
||||
|
@ -134,7 +136,7 @@ func (c *Client) MattermostPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "mattermost", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "mattermost"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Mattermost - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -4,14 +4,15 @@ package outputs
|
|||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"github.com/falcosecurity/falcosidekick/outputs/otlpmetrics"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"fmt"
|
||||
|
||||
"github.com/DataDog/datadog-go/statsd"
|
||||
mqtt "github.com/eclipse/paho.mqtt.golang"
|
||||
"github.com/google/uuid"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
otlpmetrics "github.com/falcosecurity/falcosidekick/outputs/otlp_metrics"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -32,7 +33,7 @@ func NewMQTTClient(config *types.Configuration, stats *types.Statistics, promSta
|
|||
}
|
||||
}
|
||||
options.OnConnectionLost = func(client mqtt.Client, err error) {
|
||||
log.Printf("[ERROR] : MQTT - Connection lost: %v\n", err.Error())
|
||||
utils.Log(utils.ErrorLvl, "MQTT", fmt.Sprintf("Connection lost: %v", err))
|
||||
}
|
||||
|
||||
client := mqtt.NewClient(options)
|
||||
|
@ -61,7 +62,7 @@ func (c *Client) MQTTPublish(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "mqtt", "status": err.Error()}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "mqtt"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : %s - %v\n", MQTT, err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
defer c.MQTTClient.Disconnect(100)
|
||||
|
@ -71,11 +72,11 @@ func (c *Client) MQTTPublish(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "mqtt", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "mqtt"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : %s - %v\n", MQTT, err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
log.Printf("[INFO] : %s - Message published\n", MQTT)
|
||||
utils.Log(utils.InfoLvl, c.OutputType, "Message published")
|
||||
go c.CountMetric(Outputs, 1, []string{"output:mqtt", "status:ok"})
|
||||
c.Stats.MQTT.Add(OK, 1)
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "mqtt", "status": OK}).Inc()
|
||||
|
|
|
@ -3,10 +3,11 @@
|
|||
package outputs
|
||||
|
||||
import (
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -29,7 +30,7 @@ func (c *Client) N8NPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "n8n", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "n8n"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : N8N - %v\n", err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -4,43 +4,52 @@ package outputs
|
|||
|
||||
import (
|
||||
"encoding/json"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
nats "github.com/nats-io/nats.go"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
var slugRegularExpression = regexp.MustCompile("[^a-z0-9]+")
|
||||
var slugRegExp = regexp.MustCompile("[^a-z0-9]+")
|
||||
|
||||
const defaultNatsSubjects = "falco.<priority>.<rule>"
|
||||
|
||||
// NatsPublish publishes event to NATS
|
||||
func (c *Client) NatsPublish(falcopayload types.FalcoPayload) {
|
||||
c.Stats.Nats.Add(Total, 1)
|
||||
|
||||
subject := c.Config.Nats.SubjectTemplate
|
||||
if len(subject) == 0 {
|
||||
subject = defaultNatsSubjects
|
||||
}
|
||||
|
||||
subject = strings.ReplaceAll(subject, "<priority>", strings.ToLower(falcopayload.Priority.String()))
|
||||
subject = strings.ReplaceAll(subject, "<rule>", strings.Trim(slugRegExp.ReplaceAllString(strings.ToLower(falcopayload.Rule), "_"), "_"))
|
||||
|
||||
nc, err := nats.Connect(c.EndpointURL.String())
|
||||
if err != nil {
|
||||
c.setNatsErrorMetrics()
|
||||
log.Printf("[ERROR] : NATS - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
defer nc.Flush()
|
||||
defer nc.Close()
|
||||
|
||||
r := strings.Trim(slugRegularExpression.ReplaceAllString(strings.ToLower(falcopayload.Rule), "_"), "_")
|
||||
j, err := json.Marshal(falcopayload)
|
||||
if err != nil {
|
||||
c.setStanErrorMetrics()
|
||||
log.Printf("[ERROR] : STAN - %v\n", err.Error())
|
||||
c.setNatsErrorMetrics()
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
err = nc.Publish("falco."+strings.ToLower(falcopayload.Priority.String())+"."+r, j)
|
||||
err = nc.Publish(subject, j)
|
||||
if err != nil {
|
||||
c.setNatsErrorMetrics()
|
||||
log.Printf("[ERROR] : NATS - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -48,7 +57,7 @@ func (c *Client) NatsPublish(falcopayload types.FalcoPayload) {
|
|||
c.Stats.Nats.Add(OK, 1)
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "nats", "status": OK}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "nats"), attribute.String("status", OK)).Inc()
|
||||
log.Printf("[INFO] : NATS - Publish OK\n")
|
||||
utils.Log(utils.InfoLvl, c.OutputType, "Publish OK")
|
||||
}
|
||||
|
||||
// setNatsErrorMetrics set the error stats
|
||||
|
|
|
@ -3,10 +3,11 @@
|
|||
package outputs
|
||||
|
||||
import (
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -29,7 +30,7 @@ func (c *Client) NodeRedPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "nodered", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "nodered"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : NodeRed - %v\n", err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -6,16 +6,16 @@ import (
|
|||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/falcosecurity/falcosidekick/outputs/otlpmetrics"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"strconv"
|
||||
|
||||
"github.com/DataDog/datadog-go/statsd"
|
||||
"github.com/google/uuid"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"k8s.io/client-go/kubernetes"
|
||||
"k8s.io/client-go/tools/clientcmd"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
otlpmetrics "github.com/falcosecurity/falcosidekick/outputs/otlp_metrics"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -75,10 +75,10 @@ func (c *Client) OpenfaasCall(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "openfaas", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "openfaas"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : %v - %v\n", Openfaas, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
log.Printf("[INFO] : %v - Function Response : %v\n", Openfaas, string(rawbody))
|
||||
utils.Log(utils.InfoLvl, c.OutputType, fmt.Sprintf("Function Response : %v", string(rawbody)))
|
||||
} else {
|
||||
err := c.Post(falcopayload)
|
||||
if err != nil {
|
||||
|
@ -87,11 +87,11 @@ func (c *Client) OpenfaasCall(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "openfaas", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "openfaas"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : %v - %v\n", Openfaas, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
}
|
||||
log.Printf("[INFO] : %v - Call Function \"%v\" OK\n", Openfaas, c.Config.Openfaas.FunctionName+"."+c.Config.Openfaas.FunctionNamespace)
|
||||
utils.Log(utils.InfoLvl, c.OutputType, fmt.Sprintf("Call Function \"%v\" OK", c.Config.Openfaas.FunctionName+"."+c.Config.Openfaas.FunctionNamespace))
|
||||
go c.CountMetric(Outputs, 1, []string{"output:openfaas", "status:ok"})
|
||||
c.Stats.Openfaas.Add(OK, 1)
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "openfaas", "status": OK}).Inc()
|
||||
|
|
|
@ -3,10 +3,11 @@
|
|||
package outputs
|
||||
|
||||
import (
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -25,7 +26,7 @@ func (c *Client) OpenObservePost(falcopayload types.FalcoPayload) {
|
|||
})
|
||||
if err != nil {
|
||||
c.setOpenObserveErrorMetrics()
|
||||
log.Printf("[ERROR] : OpenObserve - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -3,11 +3,12 @@
|
|||
package outputs
|
||||
|
||||
import (
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -76,7 +77,7 @@ func (c *Client) OpsgeniePost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "opsgenie", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "opsgenie"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : OpsGenie - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,121 @@
|
|||
package outputs
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/DataDog/datadog-go/statsd"
|
||||
"go.opentelemetry.io/contrib/bridges/otelslog"
|
||||
"go.opentelemetry.io/otel"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp"
|
||||
sdklog "go.opentelemetry.io/otel/sdk/log"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
otlpmetrics "github.com/falcosecurity/falcosidekick/outputs/otlp_metrics"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
func NewOtlpLogsClient(config *types.Configuration, stats *types.Statistics, promStats *types.PromStatistics,
|
||||
otlpMetrics *otlpmetrics.OTLPMetrics, statsdClient, dogstatsdClient *statsd.Client) (*Client, error) {
|
||||
initClientArgs := &types.InitClientArgs{
|
||||
Config: config,
|
||||
Stats: stats,
|
||||
DogstatsdClient: dogstatsdClient,
|
||||
PromStats: promStats,
|
||||
OTLPMetrics: otlpMetrics,
|
||||
StatsdClient: statsdClient,
|
||||
}
|
||||
otlpClient, err := NewClient("OTLP Logs", config.OTLP.Logs.Endpoint, types.CommonConfig{}, *initClientArgs)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ctx := context.Background()
|
||||
loggerProvider, err := OTLPLogsInit(ctx, config)
|
||||
if err != nil {
|
||||
utils.Log(utils.ErrorLvl, "OTLP Logs", fmt.Sprintf("Error Logger creation: %v", err))
|
||||
return nil, err
|
||||
}
|
||||
|
||||
otel.SetErrorHandler(otel.ErrorHandlerFunc(func(err error) {
|
||||
utils.Log(utils.ErrorLvl, "OTLP", err.Error())
|
||||
}))
|
||||
|
||||
utils.Log(utils.InfoLvl, "OTLP Logs", "Client created")
|
||||
otlpClient.ShutDownFunc = func() {
|
||||
if err := loggerProvider.Shutdown(ctx); err != nil {
|
||||
utils.Log(utils.ErrorLvl, "OTLP Logs", err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
otlpClient.OTLPLogsLogger = otelslog.NewLogger("falco", otelslog.WithLoggerProvider(loggerProvider))
|
||||
|
||||
return otlpClient, nil
|
||||
}
|
||||
|
||||
func OTLPLogsInit(ctx context.Context, config *types.Configuration) (*sdklog.LoggerProvider, error) {
|
||||
// As config.OTLP.Logs fields may have been set by our own config (e.g. YAML),
|
||||
// we need to set SDK environment variables accordingly.
|
||||
os.Setenv("OTEL_EXPORTER_OTLP_LOGS_ENDPOINT", strings.TrimSpace(config.OTLP.Logs.Endpoint))
|
||||
if config.OTLP.Logs.Protocol != "" {
|
||||
os.Setenv("OTEL_EXPORTER_OTLP_LOGS_PROTOCOL", strings.TrimSpace(config.OTLP.Logs.Protocol))
|
||||
}
|
||||
if config.OTLP.Logs.Headers != "" {
|
||||
os.Setenv("OTEL_EXPORTER_OTLP_LOGS_HEADERS", strings.TrimSpace(config.OTLP.Logs.Headers))
|
||||
}
|
||||
if config.OTLP.Logs.Timeout != 0 {
|
||||
os.Setenv("OTEL_EXPORTER_OTLP_LOGS_TIMEOUT", fmt.Sprintf("%d", config.OTLP.Logs.Timeout))
|
||||
}
|
||||
if len(config.OTLP.Logs.ExtraEnvVars) != 0 {
|
||||
for i, j := range config.OTLP.Logs.ExtraEnvVars {
|
||||
os.Setenv(i, j)
|
||||
}
|
||||
}
|
||||
|
||||
var exporter sdklog.Exporter
|
||||
var err error
|
||||
switch config.OTLP.Logs.Protocol {
|
||||
case GRPC:
|
||||
opts := []otlploggrpc.Option{}
|
||||
if !config.OTLP.Traces.CheckCert {
|
||||
opts = append(opts, otlploggrpc.WithInsecure())
|
||||
}
|
||||
exporter, err = otlploggrpc.New(ctx, opts...)
|
||||
default:
|
||||
opts := []otlploghttp.Option{}
|
||||
if !config.OTLP.Traces.CheckCert {
|
||||
opts = append(opts, otlploghttp.WithInsecure())
|
||||
}
|
||||
exporter, err = otlploghttp.New(ctx, opts...)
|
||||
}
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create Logs exporter: %v", err)
|
||||
}
|
||||
|
||||
loggerProvider := sdklog.NewLoggerProvider(
|
||||
sdklog.WithProcessor(
|
||||
sdklog.NewBatchProcessor(exporter),
|
||||
),
|
||||
sdklog.WithResource(newResource()),
|
||||
)
|
||||
|
||||
return loggerProvider, nil
|
||||
}
|
||||
|
||||
func (c *Client) OTLPLogsPost(falcopayload types.FalcoPayload) {
|
||||
c.OTLPLogsLogger.Info(
|
||||
falcopayload.Output,
|
||||
"priority", falcopayload.Priority.String(),
|
||||
"source", falcopayload.Source,
|
||||
"rule", falcopayload.Rule,
|
||||
"hostname", falcopayload.Hostname,
|
||||
"tags", strings.Join(falcopayload.Tags, ","),
|
||||
slog.String("timestamp", falcopayload.Time.String()),
|
||||
)
|
||||
|
||||
utils.Log(utils.InfoLvl, c.OutputType, "Sending log")
|
||||
}
|
|
@ -1,8 +1,11 @@
|
|||
package otlpmetrics
|
||||
package otlp_metrics
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"go.opentelemetry.io/otel"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc"
|
||||
|
@ -11,9 +14,8 @@ import (
|
|||
sdkmetric "go.opentelemetry.io/otel/sdk/metric"
|
||||
sdkresource "go.opentelemetry.io/otel/sdk/resource"
|
||||
semconv "go.opentelemetry.io/otel/semconv/v1.23.1"
|
||||
"log"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
)
|
||||
|
||||
const (
|
||||
|
@ -50,6 +52,13 @@ func InitProvider(ctx context.Context, config *Config) (func(ctx context.Context
|
|||
return nil, fmt.Errorf("failed to create meter provider: %v", err)
|
||||
}
|
||||
|
||||
if config.Endpoint != "" {
|
||||
utils.Log(utils.InfoLvl, "OTLP Metrics", "Client created")
|
||||
otel.SetErrorHandler(otel.ErrorHandlerFunc(func(err error) {
|
||||
utils.Log(utils.ErrorLvl, "OTLP", err.Error())
|
||||
}))
|
||||
}
|
||||
|
||||
return shutdownFunc, nil
|
||||
}
|
||||
|
||||
|
@ -125,7 +134,7 @@ func setEnv(envVar, value string) (func(), error) {
|
|||
}
|
||||
return func() {
|
||||
if err := os.Setenv(envVar, ""); err != nil {
|
||||
log.Printf("[ERROR] : OTLP Metrics - Error unsetting env variable %q: %v\n", envVar, err)
|
||||
utils.Log(utils.ErrorLvl, "OTLP Metrics", fmt.Sprintf("Error unsetting env variable %q: %v", envVar, err))
|
||||
}
|
||||
}, nil
|
||||
}
|
||||
|
@ -133,21 +142,24 @@ func setEnv(envVar, value string) (func(), error) {
|
|||
// initMeterProvider initializes an OTEL meter provider (and the corresponding exporter). It returns a function to shut
|
||||
// down the meter provider.
|
||||
func initMeterProvider(ctx context.Context, config *Config) (func(context.Context) error, error) {
|
||||
var exporter sdkmetric.Exporter
|
||||
var err error
|
||||
var metricExporter sdkmetric.Exporter
|
||||
switch protocol := config.Protocol; protocol {
|
||||
switch config.Protocol {
|
||||
case "grpc":
|
||||
metricExporter, err = createGRPCExporter(ctx, config)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create gRPC exporter: %v", err)
|
||||
}
|
||||
case "http/protobuf":
|
||||
metricExporter, err = createHTTPExporter(ctx, config)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create HTTP exporter: %v", err)
|
||||
opts := []otlpmetricgrpc.Option{}
|
||||
if !config.CheckCert {
|
||||
opts = append(opts, otlpmetricgrpc.WithInsecure())
|
||||
}
|
||||
exporter, err = otlpmetricgrpc.New(ctx, opts...)
|
||||
default:
|
||||
return nil, fmt.Errorf("unsupported OTLP transport protocol: %s", protocol)
|
||||
opts := []otlpmetrichttp.Option{}
|
||||
if !config.CheckCert {
|
||||
opts = append(opts, otlpmetrichttp.WithInsecure())
|
||||
}
|
||||
exporter, err = otlpmetrichttp.New(ctx, opts...)
|
||||
}
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create Logs exporter: %v", err)
|
||||
}
|
||||
|
||||
res, err := sdkresource.New(ctx,
|
||||
|
@ -162,7 +174,7 @@ func initMeterProvider(ctx context.Context, config *Config) (func(context.Contex
|
|||
}
|
||||
|
||||
meterProvider := sdkmetric.NewMeterProvider(
|
||||
sdkmetric.WithReader(sdkmetric.NewPeriodicReader(metricExporter)),
|
||||
sdkmetric.WithReader(sdkmetric.NewPeriodicReader(exporter)),
|
||||
sdkmetric.WithResource(res),
|
||||
)
|
||||
|
||||
|
@ -170,23 +182,6 @@ func initMeterProvider(ctx context.Context, config *Config) (func(context.Contex
|
|||
return meterProvider.Shutdown, nil
|
||||
}
|
||||
|
||||
func createGRPCExporter(ctx context.Context, config *Config) (sdkmetric.Exporter, error) {
|
||||
var options []otlpmetricgrpc.Option
|
||||
if config.CheckCert == false {
|
||||
options = append(options, otlpmetricgrpc.WithInsecure())
|
||||
}
|
||||
|
||||
return otlpmetricgrpc.New(ctx, options...)
|
||||
}
|
||||
|
||||
func createHTTPExporter(ctx context.Context, config *Config) (sdkmetric.Exporter, error) {
|
||||
var options []otlpmetrichttp.Option
|
||||
if config.CheckCert == false {
|
||||
options = append(options, otlpmetrichttp.WithInsecure())
|
||||
}
|
||||
return otlpmetrichttp.New(ctx, options...)
|
||||
}
|
||||
|
||||
type Counter interface {
|
||||
With(attributes ...attribute.KeyValue) Counter
|
||||
Inc()
|
||||
|
@ -241,10 +236,9 @@ func (c *counterInstrument) Inc() {
|
|||
meter := otel.Meter(meterName)
|
||||
ruleCounter, err := meter.Int64Counter(c.name, metric.WithDescription(c.description))
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : OTLP Metrics - Error generating metric: %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, "OTLP Metrics", fmt.Sprintf("Error generating metric: %v", err))
|
||||
return
|
||||
}
|
||||
|
||||
ruleCounter.Add(context.Background(), 1, metric.WithAttributes(c.attributes...))
|
||||
log.Println("[INFO] : OTLP Metrics - OK")
|
||||
}
|
|
@ -7,16 +7,17 @@ import (
|
|||
"encoding/hex"
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/falcosecurity/falcosidekick/outputs/otlpmetrics"
|
||||
"hash/fnv"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"github.com/DataDog/datadog-go/statsd"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
"go.opentelemetry.io/otel"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
otlpmetrics "github.com/falcosecurity/falcosidekick/outputs/otlp_metrics"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
// Unit-testing helper
|
||||
|
@ -32,16 +33,23 @@ func NewOtlpTracesClient(config *types.Configuration, stats *types.Statistics, p
|
|||
OTLPMetrics: otlpMetrics,
|
||||
StatsdClient: statsdClient,
|
||||
}
|
||||
otlpClient, err := NewClient("OTLPTraces", config.OTLP.Traces.Endpoint, types.CommonConfig{}, *initClientArgs)
|
||||
otlpClient, err := NewClient("OTLP Traces", config.OTLP.Traces.Endpoint, types.CommonConfig{}, *initClientArgs)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
shutDownFunc, err := otlpInit(config)
|
||||
|
||||
ctx := context.Background()
|
||||
shutDownFunc, err := OTLPTracesInit(otlpClient, config, ctx)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : OLTP Traces - Error client creation: %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, "OTLP Traces", fmt.Sprintf("Error client creation: %v", err))
|
||||
return nil, err
|
||||
}
|
||||
log.Printf("[INFO] : OTLP Traces - %+v\n", config.OTLP.Traces)
|
||||
|
||||
otel.SetErrorHandler(otel.ErrorHandlerFunc(func(err error) {
|
||||
utils.Log(utils.ErrorLvl, "OTLP", err.Error())
|
||||
}))
|
||||
|
||||
utils.Log(utils.InfoLvl, "OTLP Traces", "Client created")
|
||||
otlpClient.ShutDownFunc = shutDownFunc
|
||||
return otlpClient, nil
|
||||
}
|
||||
|
@ -70,16 +78,16 @@ func (c *Client) newTrace(falcopayload types.FalcoPayload) (*trace.Span, error)
|
|||
span.SetAttributes(attribute.String("source", falcopayload.Source))
|
||||
span.SetAttributes(attribute.String("priority", falcopayload.Priority.String()))
|
||||
span.SetAttributes(attribute.String("rule", falcopayload.Rule))
|
||||
span.SetAttributes(attribute.String("output", falcopayload.Output))
|
||||
span.SetAttributes(attribute.String("hostname", falcopayload.Hostname))
|
||||
span.SetAttributes(attribute.StringSlice("tags", falcopayload.Tags))
|
||||
for k, v := range falcopayload.OutputFields {
|
||||
span.SetAttributes(attribute.String(k, fmt.Sprintf("%v", v)))
|
||||
}
|
||||
span.AddEvent(falcopayload.Output, trace.EventOption(trace.WithTimestamp(falcopayload.Time)))
|
||||
span.End(trace.WithTimestamp(endTime))
|
||||
|
||||
if c.Config.Debug {
|
||||
log.Printf("[DEBUG] : OTLP Traces - payload generated successfully for traceid=%s", span.SpanContext().TraceID())
|
||||
utils.Log(utils.DebugLvl, c.OutputType, fmt.Sprintf("Payload generated successfully for traceid=%s", span.SpanContext().TraceID()))
|
||||
}
|
||||
|
||||
return &span, nil
|
||||
|
@ -93,21 +101,10 @@ func (c *Client) OTLPTracesPost(falcopayload types.FalcoPayload) {
|
|||
|
||||
_, err := c.newTrace(falcopayload)
|
||||
if err != nil {
|
||||
go c.CountMetric(Outputs, 1, []string{"output:otlptraces", "status:error"})
|
||||
c.Stats.OTLPTraces.Add(Error, 1)
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "otlptraces", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "otlptraces"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : OLTP Traces - Error generating trace: %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("Error generating trace: %v", err))
|
||||
return
|
||||
}
|
||||
// Setting the success status
|
||||
go c.CountMetric(Outputs, 1, []string{"output:otlptraces", "status:ok"})
|
||||
c.Stats.OTLPTraces.Add(OK, 1)
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "otlptraces", "status": OK}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "otlptraces"),
|
||||
attribute.String("status", OK)).Inc()
|
||||
log.Println("[INFO] : OLTP Traces - OK")
|
||||
utils.Log(utils.InfoLvl, c.OutputType, "Sending trace")
|
||||
}
|
||||
|
||||
func generateTraceID(falcopayload types.FalcoPayload) (trace.TraceID, error) {
|
||||
|
|
|
@ -5,17 +5,18 @@ package outputs
|
|||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
"go.opentelemetry.io/otel"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
|
||||
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
|
||||
otelresource "go.opentelemetry.io/otel/sdk/resource"
|
||||
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
||||
semconv "go.opentelemetry.io/otel/semconv/v1.23.1"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
const (
|
||||
|
@ -31,18 +32,25 @@ func newResource() *otelresource.Resource {
|
|||
)
|
||||
}
|
||||
|
||||
func installExportPipeline(config *types.Configuration, ctx context.Context) (func(context.Context) error, error) {
|
||||
var client otlptrace.Client
|
||||
switch config.OTLP.Traces.CheckCert {
|
||||
case true:
|
||||
client = otlptracehttp.NewClient()
|
||||
case false:
|
||||
client = otlptracehttp.NewClient(otlptracehttp.WithInsecure())
|
||||
func installTracesExportPipeline(config *types.Configuration, ctx context.Context) (func(context.Context) error, error) {
|
||||
var exporter sdktrace.SpanExporter
|
||||
var err error
|
||||
switch config.OTLP.Traces.Protocol {
|
||||
case GRPC:
|
||||
opts := []otlptracegrpc.Option{}
|
||||
if !config.OTLP.Traces.CheckCert {
|
||||
opts = append(opts, otlptracegrpc.WithInsecure())
|
||||
}
|
||||
exporter, err = otlptracegrpc.New(ctx, opts...)
|
||||
default:
|
||||
opts := []otlptracehttp.Option{}
|
||||
if !config.OTLP.Traces.CheckCert {
|
||||
opts = append(opts, otlptracehttp.WithInsecure())
|
||||
}
|
||||
exporter, err = otlptracehttp.New(ctx, opts...)
|
||||
}
|
||||
|
||||
exporter, err := otlptrace.New(ctx, client)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("creating OTLP trace exporter: %w", err)
|
||||
return nil, fmt.Errorf("failed to create Traces exporter: %v", err)
|
||||
}
|
||||
|
||||
withBatcher := sdktrace.WithBatcher(exporter)
|
||||
|
@ -58,7 +66,7 @@ func installExportPipeline(config *types.Configuration, ctx context.Context) (fu
|
|||
return tracerProvider.Shutdown, nil
|
||||
}
|
||||
|
||||
func otlpInit(config *types.Configuration) (func(), error) {
|
||||
func OTLPTracesInit(client *Client, config *types.Configuration, ctx context.Context) (func(), error) {
|
||||
// As config.OTLP.Traces fields may have been set by our own config (e.g. YAML),
|
||||
// we need to set SDK environment variables accordingly.
|
||||
os.Setenv("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", strings.TrimSpace(config.OTLP.Traces.Endpoint))
|
||||
|
@ -76,15 +84,14 @@ func otlpInit(config *types.Configuration) (func(), error) {
|
|||
os.Setenv(i, j)
|
||||
}
|
||||
}
|
||||
ctx := context.Background()
|
||||
// Registers a tracer Provider globally.
|
||||
shutdown, err := installExportPipeline(config, ctx)
|
||||
shutdown, err := installTracesExportPipeline(config, ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
shutDownCallback := func() {
|
||||
if err := shutdown(ctx); err != nil {
|
||||
log.Printf("[ERROR] : OLTP Traces - Error: %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, "OTLP Traces", err.Error())
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,10 +6,9 @@ import (
|
|||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
|
||||
"go.opentelemetry.io/otel/trace"
|
||||
)
|
||||
|
||||
func TestOtlpNewTrace(t *testing.T) {
|
||||
|
|
|
@ -4,14 +4,14 @@ package outputs
|
|||
|
||||
import (
|
||||
"context"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"sort"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/PagerDuty/go-pagerduty"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -38,7 +38,7 @@ func (c *Client) PagerdutyPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "pagerduty", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "pagerduty"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : PagerDuty - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -47,7 +47,7 @@ func (c *Client) PagerdutyPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "pagerduty", "status": OK}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "pagerduty"),
|
||||
attribute.String("status", OK)).Inc()
|
||||
log.Printf("[INFO] : Pagerduty - Create Incident OK\n")
|
||||
utils.Log(utils.InfoLvl, c.OutputType, "Create Incident OK")
|
||||
}
|
||||
|
||||
func createPagerdutyEvent(falcopayload types.FalcoPayload, config types.PagerdutyConfig) pagerduty.V2Event {
|
||||
|
|
|
@ -4,14 +4,11 @@ package outputs
|
|||
|
||||
import (
|
||||
"context"
|
||||
"github.com/falcosecurity/falcosidekick/outputs/otlpmetrics"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"github.com/DataDog/datadog-go/statsd"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
corev1 "k8s.io/api/core/v1"
|
||||
errorsv1 "k8s.io/apimachinery/pkg/api/errors"
|
||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
|
@ -20,6 +17,10 @@ import (
|
|||
"k8s.io/client-go/tools/clientcmd"
|
||||
wgpolicy "sigs.k8s.io/wg-policy-prototypes/policy-report/pkg/api/wgpolicyk8s.io/v1alpha2"
|
||||
crd "sigs.k8s.io/wg-policy-prototypes/policy-report/pkg/generated/v1alpha2/clientset/versioned"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
otlpmetrics "github.com/falcosecurity/falcosidekick/outputs/otlp_metrics"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
type resource struct {
|
||||
|
@ -32,18 +33,18 @@ const (
|
|||
policyReportName string = "falco-policy-report"
|
||||
policyReportSource string = "Falco"
|
||||
|
||||
update string = "Update"
|
||||
create string = "Create"
|
||||
updateStr string = "Update"
|
||||
createStr string = "Create"
|
||||
|
||||
high wgpolicy.PolicyResultSeverity = "high"
|
||||
low wgpolicy.PolicyResultSeverity = "low"
|
||||
medium wgpolicy.PolicyResultSeverity = "medium"
|
||||
info wgpolicy.PolicyResultSeverity = "info"
|
||||
critical wgpolicy.PolicyResultSeverity = "critical"
|
||||
highStr wgpolicy.PolicyResultSeverity = "high"
|
||||
lowStr wgpolicy.PolicyResultSeverity = "low"
|
||||
mediumStr wgpolicy.PolicyResultSeverity = "medium"
|
||||
infoStr wgpolicy.PolicyResultSeverity = "info"
|
||||
criticalStr wgpolicy.PolicyResultSeverity = "critical"
|
||||
|
||||
fail wgpolicy.PolicyResult = "fail"
|
||||
warn wgpolicy.PolicyResult = "warn"
|
||||
skip wgpolicy.PolicyResult = "skip"
|
||||
failStr wgpolicy.PolicyResult = "fail"
|
||||
warnStr wgpolicy.PolicyResult = "warn"
|
||||
skipStr wgpolicy.PolicyResult = "skip"
|
||||
|
||||
k8sPodName string = "k8s.pod.name"
|
||||
k8sNsName string = "k8s.ns.name"
|
||||
|
@ -106,7 +107,7 @@ func NewPolicyReportClient(config *types.Configuration, stats *types.Statistics,
|
|||
if err != nil {
|
||||
clientConfig, err = clientcmd.BuildConfigFromFlags("", config.PolicyReport.Kubeconfig)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : PolicyReport - Unable to load kube config file: %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, "PolicyReport", fmt.Sprintf("Unable to load kube config file: %v", err))
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
@ -122,7 +123,7 @@ func NewPolicyReportClient(config *types.Configuration, stats *types.Statistics,
|
|||
if config.PolicyReport.FalcoNamespace == "" {
|
||||
dat, err := os.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/namespace")
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : PolicyReport - Unable to get the Falcosidekick's namespace, '%v' used instead\n", defaultNamespace)
|
||||
utils.Log(utils.ErrorLvl, "PolicyReport", fmt.Sprintf("Unable to get the Falcosidekick's namespace, '%v' used instead", defaultNamespace))
|
||||
} else {
|
||||
defaultNamespace = string(dat)
|
||||
}
|
||||
|
@ -193,12 +194,12 @@ func newResult(falcopayload types.FalcoPayload) *wgpolicy.PolicyReportResult {
|
|||
}
|
||||
|
||||
func (c *Client) createOrUpdatePolicyReport(result *wgpolicy.PolicyReportResult, namespace string) error {
|
||||
action := update
|
||||
action := updateStr
|
||||
|
||||
_, err := c.KubernetesClient.CoreV1().Namespaces().Get(context.Background(), namespace, metav1.GetOptions{})
|
||||
if err != nil {
|
||||
if errorsv1.IsNotFound(err) {
|
||||
log.Printf("[INFO] : PolicyReport - Can't find the namespace '%v', fallback to '%v'\n", namespace, defaultNamespace)
|
||||
utils.Log(utils.InfoLvl, c.OutputType, fmt.Sprintf("Can't find the namespace '%v', fallback to '%v'", namespace, defaultNamespace))
|
||||
namespace = defaultNamespace
|
||||
result.Subjects[0].Namespace = defaultNamespace
|
||||
}
|
||||
|
@ -212,7 +213,7 @@ func (c *Client) createOrUpdatePolicyReport(result *wgpolicy.PolicyReportResult,
|
|||
}
|
||||
if policyr.Name == "" {
|
||||
policyr = newPolicyReport()
|
||||
action = create
|
||||
action = createStr
|
||||
}
|
||||
|
||||
policyr.Results = append(policyr.Results, *result)
|
||||
|
@ -223,41 +224,41 @@ func (c *Client) createOrUpdatePolicyReport(result *wgpolicy.PolicyReportResult,
|
|||
|
||||
policyr.Summary = getSummary(policyr.Results)
|
||||
|
||||
if action == create {
|
||||
if action == createStr {
|
||||
_, err := c.Crdclient.Wgpolicyk8sV1alpha2().PolicyReports(namespace).Create(context.Background(), policyr, metav1.CreateOptions{})
|
||||
if err != nil {
|
||||
if errorsv1.IsAlreadyExists(err) {
|
||||
action = update
|
||||
action = updateStr
|
||||
policyr, err = c.Crdclient.Wgpolicyk8sV1alpha2().PolicyReports(namespace).Get(context.Background(), policyReportName, metav1.GetOptions{})
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : PolicyReport - Error with with the Policy Report %v in namespace %v: %v\n", policyReportName, namespace, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("Error with with the Policy Report %v in namespace %v: %v", policyReportName, namespace, err))
|
||||
return err
|
||||
}
|
||||
_, err := c.Crdclient.Wgpolicyk8sV1alpha2().PolicyReports(namespace).Update(context.Background(), policyr, metav1.UpdateOptions{})
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : PolicyReport - Can't %v the Policy Report %v in namespace %v: %v\n", action, policyReportName, namespace, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("Can't %v the Policy Report %v in namespace %v: %v", action, policyReportName, namespace, err))
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
log.Printf("[ERROR] : PolicyReport - Can't %v the Policy Report %v in namespace %v: %v\n", action, policyReportName, namespace, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("Can't %v the Policy Report %v in namespace %v: %v", action, policyReportName, namespace, err))
|
||||
return err
|
||||
}
|
||||
}
|
||||
log.Printf("[INFO] : PolicyReport - %v the Policy Report %v in namespace %v\n", action, policyReportName, namespace)
|
||||
utils.Log(utils.InfoLvl, c.OutputType, fmt.Sprintf("%v the Policy Report %v in namespace %v", action, policyReportName, namespace))
|
||||
return nil
|
||||
} else {
|
||||
_, err := c.Crdclient.Wgpolicyk8sV1alpha2().PolicyReports(namespace).Update(context.Background(), policyr, metav1.UpdateOptions{})
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : PolicyReport - Can't %v the Policy Report %v in namespace %v: %v\n", action, policyReportName, namespace, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("Can't %v the Policy Report %v in namespace %v: %v", action, policyReportName, namespace, err))
|
||||
return err
|
||||
}
|
||||
log.Printf("[INFO] : PolicyReport - %v the Policy Report %v in namespace %v\n", action, policyReportName, namespace)
|
||||
utils.Log(utils.InfoLvl, c.OutputType, fmt.Sprintf("%v the Policy Report %v in namespace %v", action, policyReportName, namespace))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Client) createOrUpdateClusterPolicyReport(result *wgpolicy.PolicyReportResult) error {
|
||||
action := update
|
||||
action := updateStr
|
||||
|
||||
cpolicyr, err := c.Crdclient.Wgpolicyk8sV1alpha2().ClusterPolicyReports().Get(context.Background(), clusterPolicyReportName, metav1.GetOptions{})
|
||||
if err != nil {
|
||||
|
@ -265,9 +266,9 @@ func (c *Client) createOrUpdateClusterPolicyReport(result *wgpolicy.PolicyReport
|
|||
return err
|
||||
}
|
||||
}
|
||||
if cpolicyr == nil {
|
||||
if cpolicyr.Name == "" {
|
||||
cpolicyr = newClusterPolicyReport()
|
||||
action = create
|
||||
action = createStr
|
||||
}
|
||||
|
||||
cpolicyr.Results = append(cpolicyr.Results, *result)
|
||||
|
@ -278,35 +279,35 @@ func (c *Client) createOrUpdateClusterPolicyReport(result *wgpolicy.PolicyReport
|
|||
|
||||
cpolicyr.Summary = getSummary(cpolicyr.Results)
|
||||
|
||||
if action == create {
|
||||
if action == createStr {
|
||||
_, err := c.Crdclient.Wgpolicyk8sV1alpha2().ClusterPolicyReports().Create(context.Background(), cpolicyr, metav1.CreateOptions{})
|
||||
if err != nil {
|
||||
if errorsv1.IsAlreadyExists(err) {
|
||||
action = update
|
||||
action = updateStr
|
||||
cpolicyr, err = c.Crdclient.Wgpolicyk8sV1alpha2().ClusterPolicyReports().Get(context.Background(), policyReportName, metav1.GetOptions{})
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : PolicyReport - Error with with the Cluster Policy Report %v: %v\n", policyReportName, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("Error with with the Cluster Policy Report %v: %v", policyReportName, err))
|
||||
return err
|
||||
}
|
||||
_, err := c.Crdclient.Wgpolicyk8sV1alpha2().ClusterPolicyReports().Update(context.Background(), cpolicyr, metav1.UpdateOptions{})
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : PolicyReport - Can't %v the Cluster Policy Report %v: %v\n", action, policyReportName, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("Can't %v the Cluster Policy Report %v: %v", action, policyReportName, err))
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
log.Printf("[ERROR] : PolicyReport - Can't %v the Cluster Policy Report %v: %v\n", action, clusterPolicyReportName, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("Can't %v the Cluster Policy Report %v: %v", action, clusterPolicyReportName, err))
|
||||
return err
|
||||
}
|
||||
}
|
||||
log.Printf("[INFO] : PolicyReport - %v Cluster the Policy Report %v\n", action, policyReportName)
|
||||
utils.Log(utils.InfoLvl, c.OutputType, fmt.Sprintf("%v Cluster the Policy Report %v", action, policyReportName))
|
||||
return nil
|
||||
} else {
|
||||
_, err := c.Crdclient.Wgpolicyk8sV1alpha2().ClusterPolicyReports().Update(context.Background(), cpolicyr, metav1.UpdateOptions{})
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : PolicyReport - Can't %v the Cluster Policy Report %v: %v\n", action, clusterPolicyReportName, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("Can't %v the Cluster Policy Report %v: %v", action, clusterPolicyReportName, err))
|
||||
return err
|
||||
}
|
||||
log.Printf("[INFO] : PolicyReport - %v the ClusterPolicy Report %v\n", action, policyReportName)
|
||||
utils.Log(utils.InfoLvl, c.OutputType, fmt.Sprintf("%v the ClusterPolicy Report %v", action, policyReportName))
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
@ -332,25 +333,25 @@ func getSummary(results []wgpolicy.PolicyReportResult) wgpolicy.PolicyReportSumm
|
|||
|
||||
func mapResult(event types.FalcoPayload) wgpolicy.PolicyResult {
|
||||
if event.Priority <= types.Notice {
|
||||
return skip
|
||||
return skipStr
|
||||
} else if event.Priority == types.Warning {
|
||||
return warn
|
||||
return warnStr
|
||||
} else {
|
||||
return fail
|
||||
return failStr
|
||||
}
|
||||
}
|
||||
|
||||
func mapSeverity(event types.FalcoPayload) wgpolicy.PolicyResultSeverity {
|
||||
if event.Priority <= types.Informational {
|
||||
return info
|
||||
return infoStr
|
||||
} else if event.Priority <= types.Notice {
|
||||
return low
|
||||
return lowStr
|
||||
} else if event.Priority <= types.Warning {
|
||||
return medium
|
||||
return mediumStr
|
||||
} else if event.Priority <= types.Error {
|
||||
return high
|
||||
return highStr
|
||||
} else {
|
||||
return critical
|
||||
return criticalStr
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -4,10 +4,11 @@ package outputs
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -144,7 +145,7 @@ func (c *Client) AutoCreateQuickwitIndex(args types.InitClientArgs) error {
|
|||
}
|
||||
|
||||
if args.Config.Debug {
|
||||
log.Printf("[DEBUG] : Quickwit - mapping: %#v\n", mapping)
|
||||
utils.Log(utils.DebugLvl, c.OutputType, fmt.Sprintf("mapping: %v", mapping))
|
||||
}
|
||||
|
||||
err = quickwitInitClient.Post(mapping)
|
||||
|
@ -161,7 +162,7 @@ func (c *Client) QuickwitPost(falcopayload types.FalcoPayload) {
|
|||
c.Stats.Quickwit.Add(Total, 1)
|
||||
|
||||
if c.Config.Debug {
|
||||
log.Printf("[DEBUG] : Quickwit - ingesting payload: %v\n", falcopayload)
|
||||
utils.Log(utils.DebugLvl, c.OutputType, fmt.Sprintf("ingesting payload: %v", falcopayload))
|
||||
}
|
||||
|
||||
err := c.Post(falcopayload, func(req *http.Request) {
|
||||
|
@ -176,7 +177,7 @@ func (c *Client) QuickwitPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "quickwit", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "quickwit"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Quickwit - %v\n", err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -5,13 +5,15 @@ package outputs
|
|||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"github.com/falcosecurity/falcosidekick/outputs/otlpmetrics"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"fmt"
|
||||
|
||||
"github.com/DataDog/datadog-go/statsd"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
amqp "github.com/rabbitmq/amqp091-go"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
otlpmetrics "github.com/falcosecurity/falcosidekick/outputs/otlp_metrics"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
// NewRabbitmqClient returns a new output.Client for accessing the RabbitmMQ API.
|
||||
|
@ -22,12 +24,12 @@ func NewRabbitmqClient(config *types.Configuration, stats *types.Statistics, pro
|
|||
if config.Rabbitmq.URL != "" && config.Rabbitmq.Queue != "" {
|
||||
conn, err := amqp.Dial(config.Rabbitmq.URL)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : Rabbitmq - %v\n", "Error while connecting rabbitmq")
|
||||
utils.Log(utils.ErrorLvl, "Rabbitmq", "Error while connecting rabbitmq")
|
||||
return nil, errors.New("error while connecting Rabbitmq")
|
||||
}
|
||||
ch, err := conn.Channel()
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : Rabbitmq Channel - %v\n", "Error while creating rabbitmq channel")
|
||||
utils.Log(utils.ErrorLvl, "Rabbitmq", "Error while creating rabbitmq channel")
|
||||
return nil, errors.New("error while creating rabbitmq channel")
|
||||
}
|
||||
channel = ch
|
||||
|
@ -57,7 +59,7 @@ func (c *Client) Publish(falcopayload types.FalcoPayload) {
|
|||
})
|
||||
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : RabbitMQ - %v - %v\n", "Error while publishing message", err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("Error while publishing message: %v", err))
|
||||
c.Stats.Rabbitmq.Add(Error, 1)
|
||||
go c.CountMetric("outputs", 1, []string{"output:rabbitmq", "status:error"})
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "rabbitmq", "status": Error}).Inc()
|
||||
|
@ -67,7 +69,7 @@ func (c *Client) Publish(falcopayload types.FalcoPayload) {
|
|||
return
|
||||
}
|
||||
|
||||
log.Printf("[INFO] : RabbitMQ - Send to message OK \n")
|
||||
utils.Log(utils.InfoLvl, c.OutputType, "Message published OK")
|
||||
c.Stats.Rabbitmq.Add(OK, 1)
|
||||
go c.CountMetric("outputs", 1, []string{"output:rabbitmq", "status:ok"})
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "rabbitmq", "status": OK}).Inc()
|
||||
|
|
|
@ -5,14 +5,16 @@ package outputs
|
|||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"github.com/falcosecurity/falcosidekick/outputs/otlpmetrics"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/DataDog/datadog-go/statsd"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
"github.com/redis/go-redis/v9"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
otlpmetrics "github.com/falcosecurity/falcosidekick/outputs/otlp_metrics"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
func (c *Client) ReportError(err error) {
|
||||
|
@ -21,7 +23,7 @@ func (c *Client) ReportError(err error) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "redis", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "redis"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Redis - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
}
|
||||
|
||||
func NewRedisClient(config *types.Configuration, stats *types.Statistics, promStats *types.PromStatistics,
|
||||
|
@ -35,9 +37,9 @@ func NewRedisClient(config *types.Configuration, stats *types.Statistics, promSt
|
|||
// Ping the Redis server to check if it's running
|
||||
pong, err := rClient.Ping(context.Background()).Result()
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : Redis - Misconfiguration, cannot connect to the server %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, "Redis", fmt.Sprintf("Misconfiguration, cannot connect to the server: %v", err))
|
||||
}
|
||||
log.Printf("[INFO] : Redis - Connected to redis server: %v\n", pong)
|
||||
utils.Log(utils.InfoLvl, "Redis", fmt.Sprintf("Connected to redis server: %v", pong))
|
||||
|
||||
return &Client{
|
||||
OutputType: "Redis",
|
||||
|
|
|
@ -4,11 +4,13 @@ package outputs
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"fmt"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -74,7 +76,7 @@ func newRocketchatPayload(falcopayload types.FalcoPayload, config *types.Configu
|
|||
if config.Rocketchat.MessageFormatTemplate != nil {
|
||||
buf := &bytes.Buffer{}
|
||||
if err := config.Rocketchat.MessageFormatTemplate.Execute(buf, falcopayload); err != nil {
|
||||
log.Printf("[ERROR] : RocketChat - Error expanding RocketChat message %v", err)
|
||||
utils.Log(utils.ErrorLvl, "RocketChat", fmt.Sprintf("Error expanding RocketChat message: %v", err))
|
||||
} else {
|
||||
messageText = buf.String()
|
||||
}
|
||||
|
@ -130,7 +132,7 @@ func (c *Client) RocketchatPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "rocketchat", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "rocketchat"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : RocketChat - %v\n", err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -4,11 +4,13 @@ package outputs
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"fmt"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -104,7 +106,7 @@ func newSlackPayload(falcopayload types.FalcoPayload, config *types.Configuratio
|
|||
if config.Slack.MessageFormatTemplate != nil {
|
||||
buf := &bytes.Buffer{}
|
||||
if err := config.Slack.MessageFormatTemplate.Execute(buf, falcopayload); err != nil {
|
||||
log.Printf("[ERROR] : Slack - Error expanding Slack message %v", err)
|
||||
utils.Log(utils.ErrorLvl, "Slack", fmt.Sprintf("Error expanding Slack message: %v", err))
|
||||
} else {
|
||||
messageText = buf.String()
|
||||
}
|
||||
|
@ -157,7 +159,7 @@ func (c *Client) SlackPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "slack", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "slack"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Slack - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -5,9 +5,8 @@ package outputs
|
|||
import (
|
||||
"bytes"
|
||||
"crypto/tls"
|
||||
"github.com/falcosecurity/falcosidekick/outputs/otlpmetrics"
|
||||
"fmt"
|
||||
htmlTemplate "html/template"
|
||||
"log"
|
||||
"net"
|
||||
"regexp"
|
||||
"strconv"
|
||||
|
@ -18,6 +17,8 @@ import (
|
|||
sasl "github.com/emersion/go-sasl"
|
||||
smtp "github.com/emersion/go-smtp"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
otlpmetrics "github.com/falcosecurity/falcosidekick/outputs/otlp_metrics"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -36,7 +37,7 @@ func NewSMTPClient(config *types.Configuration, stats *types.Statistics, promSta
|
|||
otlpMetrics *otlpmetrics.OTLPMetrics, statsdClient, dogstatsdClient *statsd.Client) (*Client, error) {
|
||||
reg := regexp.MustCompile(`.*:[0-9]+`)
|
||||
if !reg.MatchString(config.SMTP.HostPort) {
|
||||
log.Printf("[ERROR] : SMTP - Bad Host:Port\n")
|
||||
utils.Log(utils.ErrorLvl, "SMTP", "Bad Host:Port")
|
||||
return nil, ErrClientCreation
|
||||
}
|
||||
|
||||
|
@ -74,7 +75,7 @@ func newSMTPPayload(falcopayload types.FalcoPayload, config *types.Configuration
|
|||
var outtext bytes.Buffer
|
||||
err := ttmpl.Execute(&outtext, falcopayload)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : SMTP - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, "SMTP", err.Error())
|
||||
return s
|
||||
}
|
||||
s.Body += outtext.String()
|
||||
|
@ -90,7 +91,7 @@ func newSMTPPayload(falcopayload types.FalcoPayload, config *types.Configuration
|
|||
var outhtml bytes.Buffer
|
||||
err = htmpl.Execute(&outhtml, falcopayload)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : SMTP - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, "SMTP", err.Error())
|
||||
return s
|
||||
}
|
||||
s.Body += outhtml.String()
|
||||
|
@ -101,7 +102,7 @@ func newSMTPPayload(falcopayload types.FalcoPayload, config *types.Configuration
|
|||
func (c *Client) ReportErr(message string, err error) {
|
||||
go c.CountMetric("outputs", 1, []string{"output:smtp", "status:error"})
|
||||
c.Stats.SMTP.Add(Error, 1)
|
||||
log.Printf("[ERROR] : SMTP - %s : %v\n", message, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("%s : %v", message, err))
|
||||
}
|
||||
|
||||
func (c *Client) GetAuth() (sasl.Client, error) {
|
||||
|
@ -163,11 +164,11 @@ func (c *Client) SendMail(falcopayload types.FalcoPayload) {
|
|||
body := sp.Subject + "\n" + sp.Body
|
||||
|
||||
if c.Config.Debug {
|
||||
log.Printf("[DEBUG] : SMTP payload : \nServer: %v\n%v\n%v\nSubject: %v\n", c.Config.SMTP.HostPort, sp.From, sp.To, sp.Subject)
|
||||
utils.Log(utils.DebugLvl, c.OutputType, fmt.Sprintf("payload : \nServer: %v\n%v\n%v\nSubject: %v", c.Config.SMTP.HostPort, sp.From, sp.To, sp.Subject))
|
||||
if c.Config.SMTP.AuthMechanism != "" {
|
||||
log.Printf("[DEBUG] : SMTP - SASL Auth : \nMechanisms: %v\nUser: %v\nToken: %v\nIdentity: %v\nTrace: %v\n", c.Config.SMTP.AuthMechanism, c.Config.SMTP.User, c.Config.SMTP.Token, c.Config.SMTP.Identity, c.Config.SMTP.Trace)
|
||||
utils.Log(utils.DebugLvl, c.OutputType, fmt.Sprintf("SASL Auth : \nMechanisms: %v\nUser: %v\nToken: %v\nIdentity: %v\nTrace: %v", c.Config.SMTP.AuthMechanism, c.Config.SMTP.User, c.Config.SMTP.Token, c.Config.SMTP.Identity, c.Config.SMTP.Trace))
|
||||
} else {
|
||||
log.Printf("[DEBUG] : SMTP - SASL Auth : Disabled\n")
|
||||
utils.Log(utils.DebugLvl, c.OutputType, "SASL Auth : Disabled")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -178,7 +179,7 @@ func (c *Client) SendMail(falcopayload types.FalcoPayload) {
|
|||
return
|
||||
}
|
||||
|
||||
log.Printf("[INFO] : SMTP - Sent OK\n")
|
||||
utils.Log(utils.InfoLvl, c.OutputType, " SMTP - Sent OK\n")
|
||||
go c.CountMetric("outputs", 1, []string{"output:smtp", "status:ok"})
|
||||
c.Stats.SMTP.Add(OK, 1)
|
||||
}
|
||||
|
|
|
@ -7,18 +7,19 @@ import (
|
|||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/falcosecurity/falcosidekick/outputs/otlpmetrics"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"net/url"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/DataDog/datadog-go/statsd"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
"github.com/google/uuid"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
otlpmetrics "github.com/falcosecurity/falcosidekick/outputs/otlp_metrics"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
const Falcosidekick_ string = "falcosidekick_"
|
||||
|
@ -190,13 +191,13 @@ func NewSpyderbatClient(config *types.Configuration, stats *types.Statistics, pr
|
|||
|
||||
hasSource, err := isSourcePresent(config)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : Spyderbat - %v\n", err.Error())
|
||||
utils.Log(utils.ErrorLvl, "Spyderbat", err.Error())
|
||||
return nil, ErrClientCreation
|
||||
}
|
||||
if !hasSource {
|
||||
if err := makeSource(config); err != nil {
|
||||
if hasSource, err2 := isSourcePresent(config); err2 != nil || !hasSource {
|
||||
log.Printf("[ERROR] : Spyderbat - %v\n", err.Error())
|
||||
utils.Log(utils.ErrorLvl, "Spyderbat", err.Error())
|
||||
return nil, ErrClientCreation
|
||||
}
|
||||
}
|
||||
|
@ -205,12 +206,12 @@ func NewSpyderbatClient(config *types.Configuration, stats *types.Statistics, pr
|
|||
source := Falcosidekick_ + config.Spyderbat.OrgUID
|
||||
data_url, err := url.JoinPath(config.Spyderbat.APIUrl, APIv1Path+config.Spyderbat.OrgUID+SourcePath+source+"/data/sb-agent")
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : Spyderbat - %v\n", err.Error())
|
||||
utils.Log(utils.ErrorLvl, "Spyderbat", err.Error())
|
||||
return nil, ErrClientCreation
|
||||
}
|
||||
endpointURL, err := url.Parse(data_url)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : Spyderbat - %v\n", err.Error())
|
||||
utils.Log(utils.ErrorLvl, "Spyderbat", err.Error())
|
||||
return nil, ErrClientCreation
|
||||
}
|
||||
return &Client{
|
||||
|
@ -243,7 +244,7 @@ func (c *Client) SpyderbatPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "spyderbat", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "spyderbat"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Spyderbat - %v\n", err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -4,12 +4,12 @@ package outputs
|
|||
|
||||
import (
|
||||
"encoding/json"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"strings"
|
||||
|
||||
stan "github.com/nats-io/stan.go"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -17,26 +17,33 @@ import (
|
|||
func (c *Client) StanPublish(falcopayload types.FalcoPayload) {
|
||||
c.Stats.Stan.Add(Total, 1)
|
||||
|
||||
subject := c.Config.Stan.SubjectTemplate
|
||||
if len(subject) == 0 {
|
||||
subject = defaultNatsSubjects
|
||||
}
|
||||
|
||||
subject = strings.ReplaceAll(subject, "<priority>", strings.ToLower(falcopayload.Priority.String()))
|
||||
subject = strings.ReplaceAll(subject, "<rule>", strings.Trim(slugRegExp.ReplaceAllString(strings.ToLower(falcopayload.Rule), "_"), "_"))
|
||||
|
||||
nc, err := stan.Connect(c.Config.Stan.ClusterID, c.Config.Stan.ClientID, stan.NatsURL(c.EndpointURL.String()))
|
||||
if err != nil {
|
||||
c.setStanErrorMetrics()
|
||||
log.Printf("[ERROR] : STAN - %v\n", err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
defer nc.Close()
|
||||
|
||||
r := strings.Trim(slugRegularExpression.ReplaceAllString(strings.ToLower(falcopayload.Rule), "_"), "_")
|
||||
j, err := json.Marshal(falcopayload)
|
||||
if err != nil {
|
||||
c.setStanErrorMetrics()
|
||||
log.Printf("[ERROR] : STAN - %v\n", err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
err = nc.Publish("falco."+strings.ToLower(falcopayload.Priority.String())+"."+r, j)
|
||||
err = nc.Publish(subject, j)
|
||||
if err != nil {
|
||||
c.setStanErrorMetrics()
|
||||
log.Printf("[ERROR] : STAN - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -45,7 +52,7 @@ func (c *Client) StanPublish(falcopayload types.FalcoPayload) {
|
|||
c.Stats.Stan.Add(OK, 1)
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "stan", "status": OK}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "stan"), attribute.String("status", OK)).Inc()
|
||||
log.Printf("[INFO] : STAN - Publish OK\n")
|
||||
utils.Log(utils.InfoLvl, c.OutputType, "Publish OK")
|
||||
}
|
||||
|
||||
// setStanErrorMetrics set the error stats
|
||||
|
|
|
@ -3,12 +3,13 @@
|
|||
package outputs
|
||||
|
||||
import (
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/DataDog/datadog-go/statsd"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -26,7 +27,7 @@ func NewStatsdClient(outputType string, config *types.Configuration, stats *type
|
|||
fwd = config.Dogstatsd.Forwarder
|
||||
}
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : Can't configure %v client for %v - %v", outputType, fwd, err)
|
||||
utils.Log(utils.ErrorLvl, outputType, fmt.Sprintf("Can't configure client for %v - %v", fwd, err))
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
@ -50,7 +51,7 @@ func (c *Client) CountMetric(metric string, value int64, tags []string) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "statsd", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "statsd"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : StatsD - Unable to send metric (%v%v%v) : %v\n", c.Config.Statsd.Namespace, metric, t, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("Unable to send metric (%v%v%v) : %v", c.Config.Statsd.Namespace, metric, t, err))
|
||||
|
||||
return
|
||||
}
|
||||
|
@ -59,7 +60,7 @@ func (c *Client) CountMetric(metric string, value int64, tags []string) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "statsd", "status": OK}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "statsd"),
|
||||
attribute.String("status", OK)).Inc()
|
||||
log.Printf("[INFO] : StatsD - Send Metric OK (%v%v%v)\n", c.Config.Statsd.Namespace, metric, t)
|
||||
utils.Log(utils.InfoLvl, c.OutputType, fmt.Sprintf("Send Metric OK (%v%v%v)", c.Config.Statsd.Namespace, metric, t))
|
||||
}
|
||||
|
||||
if c.DogstatsdClient != nil {
|
||||
|
@ -69,7 +70,7 @@ func (c *Client) CountMetric(metric string, value int64, tags []string) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "dogstatsd", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "dogstatsd"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : DogStatsD - Send Metric Error (%v%v%v) : %v\n", c.Config.Statsd.Namespace, metric, tags, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("Send Metric Error (%v%v%v) : %v", c.Config.Statsd.Namespace, metric, tags, err))
|
||||
|
||||
return
|
||||
}
|
||||
|
@ -78,6 +79,6 @@ func (c *Client) CountMetric(metric string, value int64, tags []string) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "dogstatsd", "status": OK}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "dogstatsd"),
|
||||
attribute.String("status", OK)).Inc()
|
||||
log.Printf("[INFO] : DogStatsD - Send Metric OK (%v%v %v)\n", c.Config.Statsd.Namespace, metric, tags)
|
||||
utils.Log(utils.InfoLvl, c.OutputType, fmt.Sprintf("Send Metric OK (%v%v %v)", c.Config.Statsd.Namespace, metric, tags))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,11 +3,12 @@
|
|||
package outputs
|
||||
|
||||
import (
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"net/http"
|
||||
"net/url"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -18,7 +19,7 @@ func (c *Client) SumoLogicPost(falcopayload types.FalcoPayload) {
|
|||
endpointURL, err := url.Parse(c.Config.SumoLogic.ReceiverURL)
|
||||
if err != nil {
|
||||
c.setSumoLogicErrorMetrics()
|
||||
log.Printf("[ERROR] : %v - %v\n", c.OutputType, err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -43,7 +44,7 @@ func (c *Client) SumoLogicPost(falcopayload types.FalcoPayload) {
|
|||
|
||||
if err != nil {
|
||||
c.setSumoLogicErrorMetrics()
|
||||
log.Printf("[ERROR] : %x - %v\n", c.OutputType, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -5,14 +5,15 @@ package outputs
|
|||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/falcosecurity/falcosidekick/outputs/otlpmetrics"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"log/syslog"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/DataDog/datadog-go/statsd"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
otlpmetrics "github.com/falcosecurity/falcosidekick/outputs/otlp_metrics"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -92,7 +93,7 @@ func (c *Client) SyslogPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "syslog", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "syslog"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Syslog - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -130,7 +131,7 @@ func (c *Client) SyslogPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "syslog", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "syslog"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Syslog - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -3,10 +3,9 @@
|
|||
package outputs
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -21,14 +20,13 @@ func (c *Client) TalonPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "talon", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "talon"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Talon - %v\n", err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
// Setting the success status
|
||||
go c.CountMetric(Outputs, 1, []string{"output:talon", "status:ok"})
|
||||
c.Stats.Talon.Add(OK, 1)
|
||||
fmt.Println("aaaaa")
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "talon", "status": OK}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "talon"), attribute.String("status", OK)).Inc()
|
||||
}
|
||||
|
|
|
@ -3,11 +3,12 @@
|
|||
package outputs
|
||||
|
||||
import (
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -40,7 +41,7 @@ func newTeamsPayload(falcopayload types.FalcoPayload, config *types.Configuratio
|
|||
fact teamsFact
|
||||
)
|
||||
|
||||
section.ActivityTitle = "Falco Sidekick"
|
||||
section.ActivityTitle = "Falcosidekick"
|
||||
section.ActivitySubTitle = falcopayload.Time.String()
|
||||
|
||||
if config.Teams.OutputFormat == All || config.Teams.OutputFormat == Text || config.Teams.OutputFormat == "" {
|
||||
|
@ -126,7 +127,7 @@ func (c *Client) TeamsPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "teams", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "teams"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Teams - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ func TestNewTeamsPayload(t *testing.T) {
|
|||
ThemeColor: "ccfff2",
|
||||
Sections: []teamsSection{
|
||||
{
|
||||
ActivityTitle: "Falco Sidekick",
|
||||
ActivityTitle: "Falcosidekick",
|
||||
ActivitySubTitle: "2001-01-01 01:10:00 +0000 UTC",
|
||||
ActivityImage: "",
|
||||
Text: "This is a test from falcosidekick",
|
||||
|
|
|
@ -4,8 +4,8 @@ package outputs
|
|||
|
||||
import (
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -20,7 +20,7 @@ func (c *Client) TektonPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "tekton", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "tekton"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Tekton - %v\n", err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -5,11 +5,12 @@ package outputs
|
|||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"strings"
|
||||
textTemplate "text/template"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -70,7 +71,7 @@ func newTelegramPayload(falcopayload types.FalcoPayload, config *types.Configura
|
|||
ttmpl, _ := textTemplate.New("telegram").Funcs(funcs).Parse(telegramMarkdownV2Tmpl)
|
||||
err := ttmpl.Execute(&textBuffer, falcopayload)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : Telegram - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, "Telegram", err.Error())
|
||||
return payload
|
||||
}
|
||||
payload.Text = textBuffer.String()
|
||||
|
@ -89,7 +90,7 @@ func (c *Client) TelegramPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "telegram", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "telegram"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Telegram - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -5,14 +5,15 @@ package outputs
|
|||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/falcosecurity/falcosidekick/outputs/otlpmetrics"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"strings"
|
||||
|
||||
"github.com/DataDog/datadog-go/statsd"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
otlpmetrics "github.com/falcosecurity/falcosidekick/outputs/otlp_metrics"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
type timescaledbPayload struct {
|
||||
|
@ -34,7 +35,7 @@ func NewTimescaleDBClient(config *types.Configuration, stats *types.Statistics,
|
|||
)
|
||||
connPool, err := pgxpool.New(ctx, connStr)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : TimescaleDB - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, "TimescaleDB", err.Error())
|
||||
return nil, ErrClientCreation
|
||||
}
|
||||
|
||||
|
@ -125,7 +126,7 @@ func (c *Client) TimescaleDBPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "timescaledb", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "timescaledb"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : TimescaleDB - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -136,6 +137,6 @@ func (c *Client) TimescaleDBPost(falcopayload types.FalcoPayload) {
|
|||
attribute.String("status", OK)).Inc()
|
||||
|
||||
if c.Config.Debug {
|
||||
log.Printf("[DEBUG] : TimescaleDB payload : %v\n", tsdbPayload)
|
||||
utils.Log(utils.DebugLvl, c.OutputType, fmt.Sprintf("payload : %v", tsdbPayload))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,15 +4,15 @@ package outputs
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/falcosecurity/falcosidekick/outputs/otlpmetrics"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"strings"
|
||||
|
||||
"github.com/DataDog/datadog-go/statsd"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
|
||||
wavefront "github.com/wavefronthq/wavefront-sdk-go/senders"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
otlpmetrics "github.com/falcosecurity/falcosidekick/outputs/otlp_metrics"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
// NewWavefrontClient returns a new output.Client for accessing the Wavefront API.
|
||||
|
@ -101,7 +101,7 @@ func (c *Client) WavefrontPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "wavefront", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "wavefront"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Wavefront - Unable to send event %s: %s\n", falcopayload.Rule, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("Unable to send event %s: %s", falcopayload.Rule, err))
|
||||
return
|
||||
}
|
||||
if err := sender.Flush(); err != nil {
|
||||
|
@ -109,13 +109,13 @@ func (c *Client) WavefrontPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "wavefront", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "wavefront"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Wavefront - Unable to flush event %s: %s\n", falcopayload.Rule, err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, fmt.Sprintf("Unable to flush event %s: %s", falcopayload.Rule, err))
|
||||
return
|
||||
}
|
||||
c.Stats.Wavefront.Add(OK, 1)
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "wavefront", "status": OK}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "wavefront"),
|
||||
attribute.String("status", OK)).Inc()
|
||||
log.Printf("[INFO] : Wavefront - Send Event OK %s\n", falcopayload.Rule)
|
||||
utils.Log(utils.InfoLvl, c.OutputType, fmt.Sprintf("Send Event %v OK", falcopayload.Rule))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,10 +4,11 @@ package outputs
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"text/template"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -41,7 +42,7 @@ func newWebexPayload(falcopayload types.FalcoPayload) webexPayload {
|
|||
var tpl bytes.Buffer
|
||||
|
||||
if err := webexTmpl.Execute(&tpl, falcopayload); err != nil {
|
||||
log.Printf("[ERROR] : Webex Template - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, "Webex", err.Error())
|
||||
|
||||
}
|
||||
t := webexPayload{
|
||||
|
@ -63,7 +64,7 @@ func (c *Client) WebexPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "webex", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "webex"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : Webex - %v\n", err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -3,11 +3,12 @@
|
|||
package outputs
|
||||
|
||||
import (
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -33,7 +34,7 @@ func (c *Client) WebhookPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "webhook", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "webhook"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : WebHook - %v\n", err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -4,8 +4,8 @@ package outputs
|
|||
|
||||
import (
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -32,7 +32,7 @@ func (c *Client) WebUIPost(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "webui", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "webui"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : WebUI - %v\n", err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -4,61 +4,45 @@ package outputs
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/falcosecurity/falcosidekick/outputs/otlpmetrics"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"github.com/DataDog/datadog-go/statsd"
|
||||
"github.com/aws/aws-sdk-go/aws"
|
||||
"github.com/aws/aws-sdk-go/aws/endpoints"
|
||||
"github.com/aws/aws-sdk-go/aws/session"
|
||||
"github.com/aws/aws-sdk-go/service/kinesis"
|
||||
"github.com/aws/aws-sdk-go/service/s3"
|
||||
"github.com/google/uuid"
|
||||
|
||||
"github.com/aws/aws-sdk-go/aws/credentials"
|
||||
"github.com/aws/aws-sdk-go-v2/aws"
|
||||
awsConfig "github.com/aws/aws-sdk-go-v2/config"
|
||||
"github.com/aws/aws-sdk-go-v2/credentials"
|
||||
"github.com/aws/aws-sdk-go-v2/service/kinesis"
|
||||
"github.com/aws/aws-sdk-go-v2/service/s3"
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
otlpmetrics "github.com/falcosecurity/falcosidekick/outputs/otlp_metrics"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
"github.com/google/uuid"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
)
|
||||
|
||||
// NewYandexClient returns a new output.Client for accessing the Yandex API.
|
||||
func NewYandexClient(config *types.Configuration, stats *types.Statistics, promStats *types.PromStatistics,
|
||||
otlpMetrics *otlpmetrics.OTLPMetrics, statsdClient, dogstatsdClient *statsd.Client) (*Client, error) {
|
||||
resolverFn := func(service, region string, optFns ...func(*endpoints.Options)) (endpoints.ResolvedEndpoint, error) {
|
||||
switch service {
|
||||
case endpoints.S3ServiceID:
|
||||
return endpoints.ResolvedEndpoint{
|
||||
URL: config.Yandex.S3.Endpoint,
|
||||
SigningRegion: "ru-central1",
|
||||
}, nil
|
||||
case endpoints.KinesisServiceID:
|
||||
return endpoints.ResolvedEndpoint{
|
||||
URL: config.Yandex.DataStreams.Endpoint,
|
||||
SigningRegion: "ru-central1",
|
||||
}, nil
|
||||
}
|
||||
|
||||
return endpoints.DefaultResolver().EndpointFor(service, region, optFns...)
|
||||
}
|
||||
|
||||
sess, err := session.NewSession(&aws.Config{
|
||||
Region: aws.String(config.Yandex.Region),
|
||||
Credentials: credentials.NewStaticCredentials(config.Yandex.AccessKeyID, config.Yandex.SecretAccessKey, ""),
|
||||
EndpointResolver: endpoints.ResolverFunc(resolverFn),
|
||||
})
|
||||
// Load the SDK's configuration from environment and shared config, and
|
||||
// create the client with this.
|
||||
cfg, err := awsConfig.LoadDefaultConfig(context.Background(),
|
||||
awsConfig.WithRegion(config.Yandex.Region),
|
||||
awsConfig.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(config.Yandex.AccessKeyID, config.Yandex.SecretAccessKey, "")),
|
||||
)
|
||||
if err != nil {
|
||||
log.Printf("[ERROR] : Yandex - %v\n", "Error while creating Yandex Session")
|
||||
return nil, errors.New("error while creating Yandex Session")
|
||||
log.Fatalf("failed to load SDK configuration, %v", err)
|
||||
}
|
||||
log.Printf("[INFO] : Yandex Session has been configured successfully")
|
||||
|
||||
utils.Log(utils.InfoLvl, "Yandex", "Session has been configured successfully")
|
||||
|
||||
return &Client{
|
||||
OutputType: "Yandex",
|
||||
Config: config,
|
||||
AWSSession: sess,
|
||||
AWSConfig: &cfg,
|
||||
Stats: stats,
|
||||
PromStats: promStats,
|
||||
OTLPMetrics: otlpMetrics,
|
||||
|
@ -76,7 +60,12 @@ func (c *Client) UploadYandexS3(falcopayload types.FalcoPayload) {
|
|||
prefix = c.Config.Yandex.S3.Prefix
|
||||
}
|
||||
key := fmt.Sprintf("%s/%s/%s.json", prefix, t.Format("2006-01-02"), t.Format(time.RFC3339Nano))
|
||||
_, err := s3.New(c.AWSSession).PutObject(&s3.PutObjectInput{
|
||||
_, err := s3.NewFromConfig(*c.AWSConfig, func(o *s3.Options) {
|
||||
o.BaseEndpoint = aws.String(c.Config.Yandex.S3.Endpoint)
|
||||
o.Region = c.Config.Yandex.Region
|
||||
o.UsePathStyle = true
|
||||
o.EndpointResolverV2 = s3.NewDefaultEndpointResolverV2()
|
||||
}).PutObject(context.Background(), &s3.PutObjectInput{
|
||||
Bucket: aws.String(c.Config.Yandex.S3.Bucket),
|
||||
Key: aws.String(key),
|
||||
Body: bytes.NewReader(f),
|
||||
|
@ -86,11 +75,11 @@ func (c *Client) UploadYandexS3(falcopayload types.FalcoPayload) {
|
|||
c.PromStats.Outputs.With(map[string]string{"destination": "yandexs3", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "yandexs3"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : %v S3 - %v\n", c.OutputType, err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" S3", err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
log.Printf("[INFO] : %v S3 - Upload payload OK\n", c.OutputType)
|
||||
utils.Log(utils.InfoLvl, c.OutputType+" S3", "Upload payload OK")
|
||||
|
||||
go c.CountMetric("outputs", 1, []string{"output:yandexs3", "status:ok"})
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "yandexs3", "status": "ok"}).Inc()
|
||||
|
@ -100,7 +89,11 @@ func (c *Client) UploadYandexS3(falcopayload types.FalcoPayload) {
|
|||
|
||||
// UploadYandexDataStreams uploads payload to Yandex Data Streams
|
||||
func (c *Client) UploadYandexDataStreams(falcoPayLoad types.FalcoPayload) {
|
||||
svc := kinesis.New(c.AWSSession)
|
||||
svc := kinesis.NewFromConfig(*c.AWSConfig, func(o *kinesis.Options) {
|
||||
o.BaseEndpoint = aws.String(c.Config.Yandex.DataStreams.Endpoint)
|
||||
o.Region = c.Config.Yandex.Region
|
||||
o.EndpointResolverV2 = kinesis.NewDefaultEndpointResolverV2()
|
||||
})
|
||||
|
||||
f, _ := json.Marshal(falcoPayLoad)
|
||||
input := &kinesis.PutRecordInput{
|
||||
|
@ -109,17 +102,17 @@ func (c *Client) UploadYandexDataStreams(falcoPayLoad types.FalcoPayload) {
|
|||
StreamName: aws.String(c.Config.Yandex.DataStreams.StreamName),
|
||||
}
|
||||
|
||||
resp, err := svc.PutRecord(input)
|
||||
resp, err := svc.PutRecord(context.Background(), input)
|
||||
if err != nil {
|
||||
go c.CountMetric("outputs", 1, []string{"output:yandexdatastreams", "status:error"})
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "yandexdatastreams", "status": Error}).Inc()
|
||||
c.OTLPMetrics.Outputs.With(attribute.String("destination", "yandexs3"),
|
||||
attribute.String("status", Error)).Inc()
|
||||
log.Printf("[ERROR] : %v Data Streams - %v\n", c.OutputType, err.Error())
|
||||
utils.Log(utils.ErrorLvl, c.OutputType+" Data Streams", err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
log.Printf("[INFO] : %v Data Streams - Put Record OK (%v)\n", c.OutputType, resp.SequenceNumber)
|
||||
utils.Log(utils.InfoLvl, c.OutputType+"Data Streams", fmt.Sprintf("Put Record OK (%v)", resp.SequenceNumber))
|
||||
go c.CountMetric("outputs", 1, []string{"output:yandexdatastreams", "status:ok"})
|
||||
c.Stats.YandexDataStreams.Add(OK, 1)
|
||||
c.PromStats.Outputs.With(map[string]string{"destination": "yandexdatastreams", "status": "ok"}).Inc()
|
||||
|
|
|
@ -3,10 +3,11 @@
|
|||
package outputs
|
||||
|
||||
import (
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -21,7 +22,7 @@ func (c *Client) ZincsearchPost(falcopayload types.FalcoPayload) {
|
|||
})
|
||||
if err != nil {
|
||||
c.setZincsearchErrorMetrics()
|
||||
log.Printf("[ERROR] : Zincsearch - %v\n", err)
|
||||
utils.Log(utils.ErrorLvl, c.OutputType, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
|
|
2
stats.go
2
stats.go
|
@ -89,7 +89,9 @@ func getInitStats() *types.Statistics {
|
|||
Dynatrace: getOutputNewMap("dynatrace"),
|
||||
OTLPTraces: getOutputNewMap("otlptraces"),
|
||||
OTLPMetrics: getOutputNewMap("otlpmetrics"),
|
||||
OTLPLogs: getOutputNewMap("otlplogs"),
|
||||
Talon: getOutputNewMap("talon"),
|
||||
Logstash: getOutputNewMap("logstash"),
|
||||
}
|
||||
stats.Falco.Add(outputs.Emergency, 0)
|
||||
stats.Falco.Add(outputs.Alert, 0)
|
||||
|
|
|
@ -3,13 +3,14 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
"fmt"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/prometheus/client_golang/prometheus/promauto"
|
||||
|
||||
"github.com/falcosecurity/falcosidekick/internal/pkg/utils"
|
||||
"github.com/falcosecurity/falcosidekick/types"
|
||||
)
|
||||
|
||||
|
@ -55,14 +56,21 @@ func getFalcoNewCounterVec(config *types.Configuration) *prometheus.CounterVec {
|
|||
}
|
||||
for i := range config.Customfields {
|
||||
if !regPromLabels.MatchString(strings.ReplaceAll(i, ".", "_")) {
|
||||
log.Printf("[ERROR] : Custom field '%v' is not a valid prometheus label", i)
|
||||
utils.Log(utils.ErrorLvl, "Prometheus", fmt.Sprintf("Custom field '%v' is not a valid prometheus label", i))
|
||||
continue
|
||||
}
|
||||
labelnames = append(labelnames, strings.ReplaceAll(i, ".", "_"))
|
||||
}
|
||||
for i := range config.Templatedfields {
|
||||
if !regPromLabels.MatchString(strings.ReplaceAll(i, ".", "_")) {
|
||||
utils.Log(utils.ErrorLvl, "Prometheus", fmt.Sprintf("Templated field '%v' is not a valid prometheus label", i))
|
||||
continue
|
||||
}
|
||||
labelnames = append(labelnames, strings.ReplaceAll(i, ".", "_"))
|
||||
}
|
||||
for _, i := range config.Prometheus.ExtraLabelsList {
|
||||
if !regPromLabels.MatchString(strings.ReplaceAll(i, ".", "_")) {
|
||||
log.Printf("[ERROR] : Extra field '%v' is not a valid prometheus label", i)
|
||||
utils.Log(utils.ErrorLvl, "Prometheus", fmt.Sprintf("Extra field '%v' is not a valid prometheus label", i))
|
||||
continue
|
||||
}
|
||||
labelnames = append(labelnames, strings.ReplaceAll(i, ".", "_"))
|
||||
|
|
|
@ -6,13 +6,14 @@ import (
|
|||
"context"
|
||||
"encoding/json"
|
||||
"expvar"
|
||||
"github.com/falcosecurity/falcosidekick/outputs/otlpmetrics"
|
||||
"text/template"
|
||||
"time"
|
||||
|
||||
"github.com/DataDog/datadog-go/statsd"
|
||||
"github.com/embano1/memlog"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
|
||||
otlpmetrics "github.com/falcosecurity/falcosidekick/outputs/otlp_metrics"
|
||||
)
|
||||
|
||||
// FalcoPayload is a struct to map falco event json
|
||||
|
@ -119,6 +120,7 @@ type Configuration struct {
|
|||
Dynatrace DynatraceOutputConfig
|
||||
OTLP OTLPOutputConfig
|
||||
Talon TalonOutputConfig
|
||||
Logstash LogstashConfig
|
||||
}
|
||||
|
||||
// InitClientArgs represent a client parameters for initialization
|
||||
|
@ -342,6 +344,7 @@ type LokiOutputConfig struct {
|
|||
APIKey string
|
||||
MinimumPriority string
|
||||
Tenant string
|
||||
Format string
|
||||
Endpoint string
|
||||
ExtraLabels string
|
||||
ExtraLabelsList []string
|
||||
|
@ -365,6 +368,7 @@ type prometheusOutputConfig struct {
|
|||
type natsOutputConfig struct {
|
||||
CommonConfig `mapstructure:",squash"`
|
||||
HostPort string
|
||||
SubjectTemplate string
|
||||
MinimumPriority string
|
||||
}
|
||||
|
||||
|
@ -373,6 +377,7 @@ type stanOutputConfig struct {
|
|||
HostPort string
|
||||
ClusterID string
|
||||
ClientID string
|
||||
SubjectTemplate string
|
||||
MinimumPriority string
|
||||
}
|
||||
|
||||
|
@ -807,10 +812,23 @@ type OTLPTraces struct {
|
|||
MinimumPriority string
|
||||
}
|
||||
|
||||
// OTLPLogs represents config parameters for OTLP Traces
|
||||
type OTLPLogs struct {
|
||||
Endpoint string
|
||||
Protocol string
|
||||
Timeout int64
|
||||
Synced bool
|
||||
Headers string
|
||||
ExtraEnvVars map[string]string
|
||||
CheckCert bool
|
||||
MinimumPriority string
|
||||
}
|
||||
|
||||
// OTLPOutputConfig represents config parameters for OTLP
|
||||
type OTLPOutputConfig struct {
|
||||
Traces OTLPTraces
|
||||
Metrics otlpmetrics.Config
|
||||
Logs OTLPLogs
|
||||
}
|
||||
|
||||
// TalonOutputConfig represents parameters for Talon
|
||||
|
@ -820,6 +838,20 @@ type TalonOutputConfig struct {
|
|||
MinimumPriority string
|
||||
}
|
||||
|
||||
// LogstashConfig represents config parameters for Logstash
|
||||
type LogstashConfig struct {
|
||||
Address string
|
||||
Port uint64
|
||||
MinimumPriority string
|
||||
CheckCert bool
|
||||
TLS bool
|
||||
MutualTLS bool
|
||||
CertFile string
|
||||
KeyFile string
|
||||
CaCertFile string
|
||||
Tags []string
|
||||
}
|
||||
|
||||
// Statistics is a struct to store stastics
|
||||
type Statistics struct {
|
||||
Requests *expvar.Map
|
||||
|
@ -891,7 +923,9 @@ type Statistics struct {
|
|||
Dynatrace *expvar.Map
|
||||
OTLPTraces *expvar.Map
|
||||
OTLPMetrics *expvar.Map
|
||||
OTLPLogs *expvar.Map
|
||||
Talon *expvar.Map
|
||||
Logstash *expvar.Map
|
||||
}
|
||||
|
||||
// PromStatistics is a struct to store prometheus metrics
|
||||
|
|
Loading…
Reference in New Issue