Compare commits

...

99 Commits

Author SHA1 Message Date
dependabot[bot] 2c0363e3bd build(deps): bump docker/login-action in the actions group
Bumps the actions group with 1 update: [docker/login-action](https://github.com/docker/login-action).


Updates `docker/login-action` from 3.4.0 to 3.5.0
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](74a5d14239...184bdaa072)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-version: 3.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-05 15:21:57 +02:00
dependabot[bot] 3885a33777 build(deps): bump github.com/aws/aws-sdk-go-v2/service/lambda
Bumps [github.com/aws/aws-sdk-go-v2/service/lambda](https://github.com/aws/aws-sdk-go-v2) from 1.71.2 to 1.74.1.
- [Release notes](https://github.com/aws/aws-sdk-go-v2/releases)
- [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/changelog-template.json)
- [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/rds/v1.71.2...service/s3/v1.74.1)

---
updated-dependencies:
- dependency-name: github.com/aws/aws-sdk-go-v2/service/lambda
  dependency-version: 1.74.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-05 15:20:57 +02:00
dependabot[bot] 7a8199d5ae build(deps): bump anchore/sbom-action in the actions group
Bumps the actions group with 1 update: [anchore/sbom-action](https://github.com/anchore/sbom-action).


Updates `anchore/sbom-action` from 0.20.2 to 0.20.4
- [Release notes](https://github.com/anchore/sbom-action/releases)
- [Changelog](https://github.com/anchore/sbom-action/blob/main/RELEASE.md)
- [Commits](cee1b8e05a...7b36ad622f)

---
updated-dependencies:
- dependency-name: anchore/sbom-action
  dependency-version: 0.20.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-29 09:29:08 +02:00
dependabot[bot] 0b120d6da4 build(deps): bump cloud.google.com/go/storage from 1.52.0 to 1.56.0
Bumps [cloud.google.com/go/storage](https://github.com/googleapis/google-cloud-go) from 1.52.0 to 1.56.0.
- [Release notes](https://github.com/googleapis/google-cloud-go/releases)
- [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md)
- [Commits](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.52.0...spanner/v1.56.0)

---
updated-dependencies:
- dependency-name: cloud.google.com/go/storage
  dependency-version: 1.56.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-28 20:03:07 +02:00
dependabot[bot] 8c24f1073f build(deps): bump the gomod group with 2 updates
Bumps the gomod group with 2 updates: [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) and [github.com/aws/aws-sdk-go-v2/service/kinesis](https://github.com/aws/aws-sdk-go-v2).


Updates `github.com/aws/aws-sdk-go-v2` from 1.36.5 to 1.36.6
- [Release notes](https://github.com/aws/aws-sdk-go-v2/releases)
- [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/changelog-template.json)
- [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.36.5...v1.36.6)

Updates `github.com/aws/aws-sdk-go-v2/service/kinesis` from 1.35.3 to 1.35.4
- [Release notes](https://github.com/aws/aws-sdk-go-v2/releases)
- [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/changelog-template.json)
- [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/ivs/v1.35.3...service/ssm/v1.35.4)

---
updated-dependencies:
- dependency-name: github.com/aws/aws-sdk-go-v2
  dependency-version: 1.36.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
- dependency-name: github.com/aws/aws-sdk-go-v2/service/kinesis
  dependency-version: 1.35.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-22 10:34:28 +02:00
dependabot[bot] 6096134c6b build(deps): bump sigstore/cosign-installer in the actions group
Bumps the actions group with 1 update: [sigstore/cosign-installer](https://github.com/sigstore/cosign-installer).


Updates `sigstore/cosign-installer` from 3.9.1 to 3.9.2
- [Release notes](https://github.com/sigstore/cosign-installer/releases)
- [Commits](398d4b0eee...d58896d6a1)

---
updated-dependencies:
- dependency-name: sigstore/cosign-installer
  dependency-version: 3.9.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-21 18:53:28 +02:00
dependabot[bot] 83061c5536 build(deps): bump golang.org/x/text from 0.26.0 to 0.27.0
Bumps [golang.org/x/text](https://github.com/golang/text) from 0.26.0 to 0.27.0.
- [Release notes](https://github.com/golang/text/releases)
- [Commits](https://github.com/golang/text/compare/v0.26.0...v0.27.0)

---
updated-dependencies:
- dependency-name: golang.org/x/text
  dependency-version: 0.27.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-15 11:22:46 +02:00
dependabot[bot] beb4375088 build(deps): bump anchore/sbom-action in the actions group
Bumps the actions group with 1 update: [anchore/sbom-action](https://github.com/anchore/sbom-action).


Updates `anchore/sbom-action` from 0.20.1 to 0.20.2
- [Release notes](https://github.com/anchore/sbom-action/releases)
- [Changelog](https://github.com/anchore/sbom-action/blob/main/RELEASE.md)
- [Commits](9246b90769...cee1b8e05a)

---
updated-dependencies:
- dependency-name: anchore/sbom-action
  dependency-version: 0.20.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-08 08:57:58 +02:00
dependabot[bot] 19b55bd0f1 build(deps): bump github.com/Azure/azure-sdk-for-go/sdk/azidentity
Bumps [github.com/Azure/azure-sdk-for-go/sdk/azidentity](https://github.com/Azure/azure-sdk-for-go) from 1.8.2 to 1.10.1.
- [Release notes](https://github.com/Azure/azure-sdk-for-go/releases)
- [Changelog](https://github.com/Azure/azure-sdk-for-go/blob/main/documentation/go-mgmt-sdk-release-guideline.md)
- [Commits](https://github.com/Azure/azure-sdk-for-go/compare/sdk/azidentity/v1.8.2...sdk/azidentity/v1.10.1)

---
updated-dependencies:
- dependency-name: github.com/Azure/azure-sdk-for-go/sdk/azidentity
  dependency-version: 1.10.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-08 08:55:58 +02:00
dependabot[bot] 87c64c50ca build(deps): bump github.com/aws/aws-sdk-go-v2/service/s3
Bumps [github.com/aws/aws-sdk-go-v2/service/s3](https://github.com/aws/aws-sdk-go-v2) from 1.43.0 to 1.83.0.
- [Release notes](https://github.com/aws/aws-sdk-go-v2/releases)
- [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/changelog-template.json)
- [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/s3/v1.43.0...service/s3/v1.83.0)

---
updated-dependencies:
- dependency-name: github.com/aws/aws-sdk-go-v2/service/s3
  dependency-version: 1.83.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-08 08:54:59 +02:00
dependabot[bot] 2dca2d4219 build(deps): bump go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc
Bumps [go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc](https://github.com/open-telemetry/opentelemetry-go) from 0.10.0 to 0.13.0.
- [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v0.10.0...v0.13.0)

---
updated-dependencies:
- dependency-name: go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc
  dependency-version: 0.13.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-02 11:04:28 +02:00
dependabot[bot] a2c7538cb4 build(deps): bump the gomod group across 1 directory with 2 updates
Bumps the gomod group with 2 updates in the / directory: [github.com/aws/aws-sdk-go-v2](https://github.com/aws/aws-sdk-go-v2) and [github.com/aws/aws-sdk-go-v2/service/kinesis](https://github.com/aws/aws-sdk-go-v2).


Updates `github.com/aws/aws-sdk-go-v2` from 1.36.3 to 1.36.5
- [Release notes](https://github.com/aws/aws-sdk-go-v2/releases)
- [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/changelog-template.json)
- [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.36.3...v1.36.5)

Updates `github.com/aws/aws-sdk-go-v2/service/kinesis` from 1.35.0 to 1.35.3
- [Release notes](https://github.com/aws/aws-sdk-go-v2/releases)
- [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/service/ssm/v1.35.3/CHANGELOG.md)
- [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.35.0...service/ssm/v1.35.3)

---
updated-dependencies:
- dependency-name: github.com/aws/aws-sdk-go-v2
  dependency-version: 1.36.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
- dependency-name: github.com/aws/aws-sdk-go-v2/service/kinesis
  dependency-version: 1.35.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-30 14:33:17 +02:00
dependabot[bot] ec1f02eb69 build(deps): bump the actions group across 1 directory with 3 updates
Bumps the actions group with 3 updates in the / directory: [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action), [anchore/sbom-action](https://github.com/anchore/sbom-action) and [sigstore/cosign-installer](https://github.com/sigstore/cosign-installer).


Updates `docker/setup-buildx-action` from 3.10.0 to 3.11.1
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](b5ca514318...e468171a9d)

Updates `anchore/sbom-action` from 0.20.0 to 0.20.1
- [Release notes](https://github.com/anchore/sbom-action/releases)
- [Changelog](https://github.com/anchore/sbom-action/blob/main/RELEASE.md)
- [Commits](e11c554f70...9246b90769)

Updates `sigstore/cosign-installer` from 3.8.2 to 3.9.1
- [Release notes](https://github.com/sigstore/cosign-installer/releases)
- [Commits](3454372f43...398d4b0eee)

---
updated-dependencies:
- dependency-name: docker/setup-buildx-action
  dependency-version: 3.11.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: anchore/sbom-action
  dependency-version: 0.20.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
- dependency-name: sigstore/cosign-installer
  dependency-version: 3.9.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-23 18:28:38 +02:00
Tomasz Habiger 6897e9d75f address review comments
This commit addresses code review feedback and includes the following improvements:
- Removes the unused "Password" field.
- Introduces improved error handling with contextual error wrapping.
- Cleans up and standardizes log handling.
- Switches all logging to use utils.Log() for consistency.

Signed-off-by: Tomasz Habiger <tomasz.habiger@gmail.com>
2025-06-10 11:01:59 +02:00
Tomasz Habiger c56675cf26 add logstash output
Signed-off-by: Tomasz Habiger <tomasz.habiger@gmail.com>
2025-06-10 11:01:59 +02:00
zdeneksvarc 038f7743cf fix: mattermost url
Signed-off-by: zdeneksvarc <79550344+zdeneksvarc@users.noreply.github.com>
2025-06-04 11:31:23 +02:00
dependabot[bot] 191b961b15 build(deps): bump github.com/emersion/go-smtp from 0.21.3 to 0.22.0
Bumps [github.com/emersion/go-smtp](https://github.com/emersion/go-smtp) from 0.21.3 to 0.22.0.
- [Release notes](https://github.com/emersion/go-smtp/releases)
- [Commits](https://github.com/emersion/go-smtp/compare/v0.21.3...v0.22.0)

---
updated-dependencies:
- dependency-name: github.com/emersion/go-smtp
  dependency-version: 0.22.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-03 10:02:10 +02:00
dependabot[bot] 739c7d18bd build(deps): bump github.com/aws/aws-sdk-go-v2/service/sts
Bumps [github.com/aws/aws-sdk-go-v2/service/sts](https://github.com/aws/aws-sdk-go-v2) from 1.25.3 to 1.33.19.
- [Release notes](https://github.com/aws/aws-sdk-go-v2/releases)
- [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/changelog-template.json)
- [Commits](https://github.com/aws/aws-sdk-go-v2/compare/v1.25.3...service/sns/v1.33.19)

---
updated-dependencies:
- dependency-name: github.com/aws/aws-sdk-go-v2/service/sts
  dependency-version: 1.33.19
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-27 12:04:11 +02:00
dependabot[bot] 765dd4a005 build(deps): bump go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp
Bumps [go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp](https://github.com/open-telemetry/opentelemetry-go) from 1.34.0 to 1.36.0.
- [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.34.0...v1.36.0)

---
updated-dependencies:
- dependency-name: go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp
  dependency-version: 1.36.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-27 12:02:11 +02:00
dependabot[bot] bd29893d1a build(deps): bump the gomod group with 4 updates
Bumps the gomod group with 4 updates: [github.com/googleapis/gax-go/v2](https://github.com/googleapis/gax-go), [github.com/jackc/pgx/v5](https://github.com/jackc/pgx), [github.com/segmentio/kafka-go](https://github.com/segmentio/kafka-go) and [google.golang.org/genproto](https://github.com/googleapis/go-genproto).


Updates `github.com/googleapis/gax-go/v2` from 2.14.1 to 2.14.2
- [Release notes](https://github.com/googleapis/gax-go/releases)
- [Commits](https://github.com/googleapis/gax-go/compare/v2.14.1...v2.14.2)

Updates `github.com/jackc/pgx/v5` from 5.7.4 to 5.7.5
- [Changelog](https://github.com/jackc/pgx/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jackc/pgx/compare/v5.7.4...v5.7.5)

Updates `github.com/segmentio/kafka-go` from 0.4.47 to 0.4.48
- [Release notes](https://github.com/segmentio/kafka-go/releases)
- [Commits](https://github.com/segmentio/kafka-go/compare/v0.4.47...v0.4.48)

Updates `google.golang.org/genproto` from 0.0.0-20250303144028-a0af3efb3deb to 0.0.0-20250505200425-f936aa4a68b2
- [Commits](https://github.com/googleapis/go-genproto/commits)

---
updated-dependencies:
- dependency-name: github.com/googleapis/gax-go/v2
  dependency-version: 2.14.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
- dependency-name: github.com/jackc/pgx/v5
  dependency-version: 5.7.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
- dependency-name: github.com/segmentio/kafka-go
  dependency-version: 0.4.48
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
- dependency-name: google.golang.org/genproto
  dependency-version: 0.0.0-20250505200425-f936aa4a68b2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-20 14:32:28 +02:00
dependabot[bot] f93f3c7904 build(deps): bump github.com/aws/aws-sdk-go-v2/service/kinesis
Bumps [github.com/aws/aws-sdk-go-v2/service/kinesis](https://github.com/aws/aws-sdk-go-v2) from 1.33.3 to 1.35.0.
- [Release notes](https://github.com/aws/aws-sdk-go-v2/releases)
- [Changelog](https://github.com/aws/aws-sdk-go-v2/blob/main/changelog-template.json)
- [Commits](https://github.com/aws/aws-sdk-go-v2/compare/service/efs/v1.33.3...v1.35.0)

---
updated-dependencies:
- dependency-name: github.com/aws/aws-sdk-go-v2/service/kinesis
  dependency-version: 1.35.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-20 14:26:28 +02:00
dependabot[bot] c0e7e6c19b build(deps): bump the actions group with 2 updates
Bumps the actions group with 2 updates: [anchore/sbom-action](https://github.com/anchore/sbom-action) and [aws-actions/configure-aws-credentials](https://github.com/aws-actions/configure-aws-credentials).


Updates `anchore/sbom-action` from 0.19.0 to 0.20.0
- [Release notes](https://github.com/anchore/sbom-action/releases)
- [Changelog](https://github.com/anchore/sbom-action/blob/main/RELEASE.md)
- [Commits](9f73021414...e11c554f70)

Updates `aws-actions/configure-aws-credentials` from 4.2.0 to 4.2.1
- [Release notes](https://github.com/aws-actions/configure-aws-credentials/releases)
- [Changelog](https://github.com/aws-actions/configure-aws-credentials/blob/main/CHANGELOG.md)
- [Commits](f24d7193d9...b475783126)

---
updated-dependencies:
- dependency-name: anchore/sbom-action
  dependency-version: 0.20.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: aws-actions/configure-aws-credentials
  dependency-version: 4.2.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-19 18:05:23 +02:00
dependabot[bot] a0c34e784d build(deps): bump google.golang.org/api from 0.231.0 to 0.232.0
Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.231.0 to 0.232.0.
- [Release notes](https://github.com/googleapis/google-api-go-client/releases)
- [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md)
- [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.231.0...v0.232.0)

---
updated-dependencies:
- dependency-name: google.golang.org/api
  dependency-version: 0.232.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-16 15:55:47 +02:00
dependabot[bot] 97134bd101 build(deps): bump golang.org/x/sync from 0.13.0 to 0.14.0
Bumps [golang.org/x/sync](https://github.com/golang/sync) from 0.13.0 to 0.14.0.
- [Commits](https://github.com/golang/sync/compare/v0.13.0...v0.14.0)

---
updated-dependencies:
- dependency-name: golang.org/x/sync
  dependency-version: 0.14.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-16 10:52:45 +02:00
dependabot[bot] f41e855f5d build(deps): bump go.opentelemetry.io/contrib/bridges/otelslog
Bumps [go.opentelemetry.io/contrib/bridges/otelslog](https://github.com/open-telemetry/opentelemetry-go-contrib) from 0.9.0 to 0.10.0.
- [Release notes](https://github.com/open-telemetry/opentelemetry-go-contrib/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-go-contrib/blob/main/CHANGELOG.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-go-contrib/compare/v0.9.0...v0.10.0)

---
updated-dependencies:
- dependency-name: go.opentelemetry.io/contrib/bridges/otelslog
  dependency-version: 0.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-12 19:14:24 +02:00
dependabot[bot] 2573030a3a build(deps): bump the actions group with 2 updates
Bumps the actions group with 2 updates: [actions/setup-go](https://github.com/actions/setup-go) and [aws-actions/configure-aws-credentials](https://github.com/aws-actions/configure-aws-credentials).


Updates `actions/setup-go` from 5.4.0 to 5.5.0
- [Release notes](https://github.com/actions/setup-go/releases)
- [Commits](0aaccfd150...d35c59abb0)

Updates `aws-actions/configure-aws-credentials` from 4.1.0 to 4.2.0
- [Release notes](https://github.com/aws-actions/configure-aws-credentials/releases)
- [Changelog](https://github.com/aws-actions/configure-aws-credentials/blob/main/CHANGELOG.md)
- [Commits](ececac1a45...f24d7193d9)

---
updated-dependencies:
- dependency-name: actions/setup-go
  dependency-version: 5.5.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: aws-actions/configure-aws-credentials
  dependency-version: 4.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-12 17:37:23 +02:00
f5cheliu be5b5822ab Migrate v1 to v2 for aws-sdk-go
Signed-off-by: chenliu1993 <cl2037829916@gmail.com>
2025-05-09 16:58:03 +02:00
dependabot[bot] 2e5e08d559 build(deps): bump github.com/go-jose/go-jose/v4 from 4.0.4 to 4.0.5
Bumps [github.com/go-jose/go-jose/v4](https://github.com/go-jose/go-jose) from 4.0.4 to 4.0.5.
- [Release notes](https://github.com/go-jose/go-jose/releases)
- [Changelog](https://github.com/go-jose/go-jose/blob/main/CHANGELOG.md)
- [Commits](https://github.com/go-jose/go-jose/compare/v4.0.4...v4.0.5)

---
updated-dependencies:
- dependency-name: github.com/go-jose/go-jose/v4
  dependency-version: 4.0.5
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-06 09:54:43 +02:00
dependabot[bot] f306abb797 build(deps): bump go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc
Bumps [go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc](https://github.com/open-telemetry/opentelemetry-go) from 1.34.0 to 1.35.0.
- [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.34.0...v1.35.0)

---
updated-dependencies:
- dependency-name: go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-06 09:46:44 +02:00
dependabot[bot] b4cf9f1777 build(deps): bump google.golang.org/api from 0.229.0 to 0.231.0
Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.229.0 to 0.231.0.
- [Release notes](https://github.com/googleapis/google-api-go-client/releases)
- [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md)
- [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.229.0...v0.231.0)

---
updated-dependencies:
- dependency-name: google.golang.org/api
  dependency-version: 0.231.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-06 09:45:44 +02:00
dependabot[bot] 3ac5fcbb63 build(deps): bump cloud.google.com/go/storage from 1.50.0 to 1.52.0
Bumps [cloud.google.com/go/storage](https://github.com/googleapis/google-cloud-go) from 1.50.0 to 1.52.0.
- [Release notes](https://github.com/googleapis/google-cloud-go/releases)
- [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md)
- [Commits](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.50.0...spanner/v1.52.0)

---
updated-dependencies:
- dependency-name: cloud.google.com/go/storage
  dependency-version: 1.52.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-02 15:03:21 +02:00
dependabot[bot] 0cb12b9427 build(deps): bump the actions group with 2 updates
Bumps the actions group with 2 updates: [anchore/sbom-action](https://github.com/anchore/sbom-action) and [sigstore/cosign-installer](https://github.com/sigstore/cosign-installer).


Updates `anchore/sbom-action` from 0.18.0 to 0.19.0
- [Release notes](https://github.com/anchore/sbom-action/releases)
- [Changelog](https://github.com/anchore/sbom-action/blob/main/RELEASE.md)
- [Commits](f325610c9f...9f73021414)

Updates `sigstore/cosign-installer` from 3.8.1 to 3.8.2
- [Release notes](https://github.com/sigstore/cosign-installer/releases)
- [Commits](d7d6bc7722...3454372f43)

---
updated-dependencies:
- dependency-name: anchore/sbom-action
  dependency-version: 0.19.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: sigstore/cosign-installer
  dependency-version: 3.8.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-02 15:02:21 +02:00
dependabot[bot] 6a9d9d4fac build(deps): bump github.com/prometheus/client_golang
Bumps [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang) from 1.21.1 to 1.22.0.
- [Release notes](https://github.com/prometheus/client_golang/releases)
- [Changelog](https://github.com/prometheus/client_golang/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prometheus/client_golang/compare/v1.21.1...v1.22.0)

---
updated-dependencies:
- dependency-name: github.com/prometheus/client_golang
  dependency-version: 1.22.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-02 14:57:21 +02:00
dependabot[bot] 9c46d2c14e build(deps): bump the gomod group with 7 updates
Bumps the gomod group with 7 updates:

| Package | From | To |
| --- | --- | --- |
| [cloud.google.com/go/functions](https://github.com/googleapis/google-cloud-go) | `1.19.4` | `1.19.6` |
| [go.opentelemetry.io/otel/sdk](https://github.com/open-telemetry/opentelemetry-go) | `1.34.0` | `1.35.0` |
| [go.opentelemetry.io/otel/sdk/metric](https://github.com/open-telemetry/opentelemetry-go) | `1.34.0` | `1.35.0` |
| [golang.org/x/oauth2](https://github.com/golang/oauth2) | `0.27.0` | `0.29.0` |
| [golang.org/x/sync](https://github.com/golang/sync) | `0.12.0` | `0.13.0` |
| [golang.org/x/text](https://github.com/golang/text) | `0.23.0` | `0.24.0` |
| [google.golang.org/api](https://github.com/googleapis/google-api-go-client) | `0.224.0` | `0.229.0` |


Updates `cloud.google.com/go/functions` from 1.19.4 to 1.19.6
- [Release notes](https://github.com/googleapis/google-cloud-go/releases)
- [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md)
- [Commits](https://github.com/googleapis/google-cloud-go/compare/asset/v1.19.4...asset/v1.19.6)

Updates `go.opentelemetry.io/otel/sdk` from 1.34.0 to 1.35.0
- [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.34.0...v1.35.0)

Updates `go.opentelemetry.io/otel/sdk/metric` from 1.34.0 to 1.35.0
- [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.34.0...v1.35.0)

Updates `golang.org/x/oauth2` from 0.27.0 to 0.29.0
- [Commits](https://github.com/golang/oauth2/compare/v0.27.0...v0.29.0)

Updates `golang.org/x/sync` from 0.12.0 to 0.13.0
- [Commits](https://github.com/golang/sync/compare/v0.12.0...v0.13.0)

Updates `golang.org/x/text` from 0.23.0 to 0.24.0
- [Release notes](https://github.com/golang/text/releases)
- [Commits](https://github.com/golang/text/compare/v0.23.0...v0.24.0)

Updates `google.golang.org/api` from 0.224.0 to 0.229.0
- [Release notes](https://github.com/googleapis/google-api-go-client/releases)
- [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md)
- [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.224.0...v0.229.0)

---
updated-dependencies:
- dependency-name: cloud.google.com/go/functions
  dependency-version: 1.19.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
- dependency-name: go.opentelemetry.io/otel/sdk
  dependency-version: 1.35.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gomod
- dependency-name: go.opentelemetry.io/otel/sdk/metric
  dependency-version: 1.35.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gomod
- dependency-name: golang.org/x/oauth2
  dependency-version: 0.29.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gomod
- dependency-name: golang.org/x/sync
  dependency-version: 0.13.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gomod
- dependency-name: golang.org/x/text
  dependency-version: 0.24.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gomod
- dependency-name: google.golang.org/api
  dependency-version: 0.229.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gomod
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-21 18:38:11 +02:00
dependabot[bot] e23afd1c38 build(deps): bump github.com/nats-io/nats-server/v2
Bumps [github.com/nats-io/nats-server/v2](https://github.com/nats-io/nats-server) from 2.9.23 to 2.10.27.
- [Release notes](https://github.com/nats-io/nats-server/releases)
- [Changelog](https://github.com/nats-io/nats-server/blob/main/.goreleaser.yml)
- [Commits](https://github.com/nats-io/nats-server/compare/v2.9.23...v2.10.27)

---
updated-dependencies:
- dependency-name: github.com/nats-io/nats-server/v2
  dependency-version: 2.10.27
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-16 08:49:44 +02:00
dependabot[bot] c9fb02fd0b build(deps): bump the gomod group across 1 directory with 2 updates
Bumps the gomod group with 2 updates in the / directory: [github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs](https://github.com/Azure/azure-sdk-for-go) and [github.com/jackc/pgx/v5](https://github.com/jackc/pgx).


Updates `github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs` from 1.3.1 to 1.3.2
- [Release notes](https://github.com/Azure/azure-sdk-for-go/releases)
- [Changelog](https://github.com/Azure/azure-sdk-for-go/blob/main/documentation/release.md)
- [Commits](https://github.com/Azure/azure-sdk-for-go/compare/sdk/azcore/v1.3.1...sdk/storage/azblob/v1.3.2)

Updates `github.com/jackc/pgx/v5` from 5.7.3 to 5.7.4
- [Changelog](https://github.com/jackc/pgx/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jackc/pgx/compare/v5.7.3...v5.7.4)

---
updated-dependencies:
- dependency-name: github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs
  dependency-version: 1.3.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
- dependency-name: github.com/jackc/pgx/v5
  dependency-version: 5.7.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-14 17:55:34 +02:00
dependabot[bot] e387e72b42 build(deps): bump goreleaser/goreleaser-action in the actions group
Bumps the actions group with 1 update: [goreleaser/goreleaser-action](https://github.com/goreleaser/goreleaser-action).


Updates `goreleaser/goreleaser-action` from 6.2.1 to 6.3.0
- [Release notes](https://github.com/goreleaser/goreleaser-action/releases)
- [Commits](90a3faa9d0...9c156ee8a1)

---
updated-dependencies:
- dependency-name: goreleaser/goreleaser-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-07 15:11:43 +02:00
dependabot[bot] 57182b15e7 build(deps): bump the actions group across 1 directory with 2 updates
Bumps the actions group with 2 updates in the / directory: [actions/setup-go](https://github.com/actions/setup-go) and [docker/login-action](https://github.com/docker/login-action).


Updates `actions/setup-go` from 5.3.0 to 5.4.0
- [Release notes](https://github.com/actions/setup-go/releases)
- [Commits](f111f3307d...0aaccfd150)

Updates `docker/login-action` from 3.3.0 to 3.4.0
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](9780b0c442...74a5d14239)

---
updated-dependencies:
- dependency-name: actions/setup-go
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: docker/login-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-26 10:21:28 +01:00
dependabot[bot] 491166b0b4 build(deps): bump github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs
Bumps [github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs](https://github.com/Azure/azure-sdk-for-go) from 1.2.3 to 1.3.1.
- [Release notes](https://github.com/Azure/azure-sdk-for-go/releases)
- [Changelog](https://github.com/Azure/azure-sdk-for-go/blob/main/documentation/release.md)
- [Commits](https://github.com/Azure/azure-sdk-for-go/compare/sdk/messaging/azeventhubs/v1.2.3...sdk/azcore/v1.3.1)

---
updated-dependencies:
- dependency-name: github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-26 10:20:26 +01:00
dependabot[bot] 647cbb5d3a build(deps): bump github.com/jackc/pgx/v5 in the gomod group
Bumps the gomod group with 1 update: [github.com/jackc/pgx/v5](https://github.com/jackc/pgx).


Updates `github.com/jackc/pgx/v5` from 5.7.2 to 5.7.3
- [Changelog](https://github.com/jackc/pgx/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jackc/pgx/compare/v5.7.2...v5.7.3)

---
updated-dependencies:
- dependency-name: github.com/jackc/pgx/v5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-26 10:19:27 +01:00
dependabot[bot] c05c47f94b build(deps): bump the gomod group across 1 directory with 9 updates
Bumps the gomod group with 4 updates in the / directory: [cloud.google.com/go/functions](https://github.com/googleapis/google-cloud-go), [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang), [k8s.io/api](https://github.com/kubernetes/api) and [k8s.io/client-go](https://github.com/kubernetes/client-go).


Updates `cloud.google.com/go/functions` from 1.19.3 to 1.19.4
- [Release notes](https://github.com/googleapis/google-cloud-go/releases)
- [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md)
- [Commits](https://github.com/googleapis/google-cloud-go/compare/asset/v1.19.3...asset/v1.19.4)

Updates `github.com/prometheus/client_golang` from 1.21.0 to 1.21.1
- [Release notes](https://github.com/prometheus/client_golang/releases)
- [Changelog](https://github.com/prometheus/client_golang/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prometheus/client_golang/compare/v1.21.0...v1.21.1)

Updates `golang.org/x/sync` from 0.11.0 to 0.12.0
- [Commits](https://github.com/golang/sync/compare/v0.11.0...v0.12.0)

Updates `golang.org/x/text` from 0.22.0 to 0.23.0
- [Release notes](https://github.com/golang/text/releases)
- [Commits](https://github.com/golang/text/compare/v0.22.0...v0.23.0)

Updates `google.golang.org/api` from 0.223.0 to 0.224.0
- [Release notes](https://github.com/googleapis/google-api-go-client/releases)
- [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md)
- [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.223.0...v0.224.0)

Updates `google.golang.org/genproto` from 0.0.0-20250127172529-29210b9bc287 to 0.0.0-20250303144028-a0af3efb3deb
- [Commits](https://github.com/googleapis/go-genproto/commits)

Updates `k8s.io/api` from 0.32.2 to 0.32.3
- [Commits](https://github.com/kubernetes/api/compare/v0.32.2...v0.32.3)

Updates `k8s.io/apimachinery` from 0.32.2 to 0.32.3
- [Commits](https://github.com/kubernetes/apimachinery/compare/v0.32.2...v0.32.3)

Updates `k8s.io/client-go` from 0.32.2 to 0.32.3
- [Changelog](https://github.com/kubernetes/client-go/blob/master/CHANGELOG.md)
- [Commits](https://github.com/kubernetes/client-go/compare/v0.32.2...v0.32.3)

---
updated-dependencies:
- dependency-name: cloud.google.com/go/functions
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
- dependency-name: github.com/prometheus/client_golang
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
- dependency-name: golang.org/x/sync
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gomod
- dependency-name: golang.org/x/text
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gomod
- dependency-name: google.golang.org/api
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gomod
- dependency-name: google.golang.org/genproto
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
- dependency-name: k8s.io/api
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
- dependency-name: k8s.io/apimachinery
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
- dependency-name: k8s.io/client-go
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-24 12:36:17 +01:00
dependabot[bot] 1f3d15069a build(deps): bump github.com/golang-jwt/jwt/v5 from 5.2.1 to 5.2.2
Bumps [github.com/golang-jwt/jwt/v5](https://github.com/golang-jwt/jwt) from 5.2.1 to 5.2.2.
- [Release notes](https://github.com/golang-jwt/jwt/releases)
- [Changelog](https://github.com/golang-jwt/jwt/blob/main/VERSION_HISTORY.md)
- [Commits](https://github.com/golang-jwt/jwt/compare/v5.2.1...v5.2.2)

---
updated-dependencies:
- dependency-name: github.com/golang-jwt/jwt/v5
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-22 08:58:33 +01:00
dependabot[bot] 0b443908b8 build(deps): bump github.com/redis/go-redis/v9 from 9.7.1 to 9.7.3
Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.7.1 to 9.7.3.
- [Release notes](https://github.com/redis/go-redis/releases)
- [Changelog](https://github.com/redis/go-redis/blob/master/CHANGELOG.md)
- [Commits](https://github.com/redis/go-redis/compare/v9.7.1...v9.7.3)

---
updated-dependencies:
- dependency-name: github.com/redis/go-redis/v9
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-21 18:11:32 +01:00
dependabot[bot] 8b740084e9 build(deps): bump golang.org/x/net from 0.35.0 to 0.36.0
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.35.0 to 0.36.0.
- [Commits](https://github.com/golang/net/compare/v0.35.0...v0.36.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-13 06:58:43 +01:00
dependabot[bot] da71784171 build(deps): bump go.opentelemetry.io/otel from 1.34.0 to 1.35.0
Bumps [go.opentelemetry.io/otel](https://github.com/open-telemetry/opentelemetry-go) from 1.34.0 to 1.35.0.
- [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.34.0...v1.35.0)

---
updated-dependencies:
- dependency-name: go.opentelemetry.io/otel
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-11 09:33:35 +01:00
dependabot[bot] 4462e30d59 build(deps): bump golang.org/x/oauth2 from 0.26.0 to 0.27.0
Bumps [golang.org/x/oauth2](https://github.com/golang/oauth2) from 0.26.0 to 0.27.0.
- [Commits](https://github.com/golang/oauth2/compare/v0.26.0...v0.27.0)

---
updated-dependencies:
- dependency-name: golang.org/x/oauth2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-03 17:52:53 +01:00
dependabot[bot] 1864b1df1d build(deps): bump google.golang.org/api from 0.220.0 to 0.223.0
Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.220.0 to 0.223.0.
- [Release notes](https://github.com/googleapis/google-api-go-client/releases)
- [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md)
- [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.220.0...v0.223.0)

---
updated-dependencies:
- dependency-name: google.golang.org/api
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-03 17:27:54 +01:00
dependabot[bot] 2a9ce5d9a4 build(deps): bump github.com/prometheus/client_golang
Bumps [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang) from 1.20.5 to 1.21.0.
- [Release notes](https://github.com/prometheus/client_golang/releases)
- [Changelog](https://github.com/prometheus/client_golang/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prometheus/client_golang/compare/v1.20.5...v1.21.0)

---
updated-dependencies:
- dependency-name: github.com/prometheus/client_golang
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-03 17:25:53 +01:00
dependabot[bot] e9f0e38c00 build(deps): bump github.com/google/go-cmp from 0.6.0 to 0.7.0
Bumps [github.com/google/go-cmp](https://github.com/google/go-cmp) from 0.6.0 to 0.7.0.
- [Release notes](https://github.com/google/go-cmp/releases)
- [Commits](https://github.com/google/go-cmp/compare/v0.6.0...v0.7.0)

---
updated-dependencies:
- dependency-name: github.com/google/go-cmp
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-03 17:24:53 +01:00
dependabot[bot] b3d5e7c70b build(deps): bump the actions group with 3 updates
Bumps the actions group with 3 updates: [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action), [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) and [slsa-framework/slsa-github-generator](https://github.com/slsa-framework/slsa-github-generator).


Updates `docker/setup-qemu-action` from 3.4.0 to 3.6.0
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](4574d27a47...29109295f8)

Updates `docker/setup-buildx-action` from 3.9.0 to 3.10.0
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](f7ce87c1d6...b5ca514318)

Updates `slsa-framework/slsa-github-generator` from 2.0.0 to 2.1.0
- [Release notes](https://github.com/slsa-framework/slsa-github-generator/releases)
- [Changelog](https://github.com/slsa-framework/slsa-github-generator/blob/main/CHANGELOG.md)
- [Commits](https://github.com/slsa-framework/slsa-github-generator/compare/v2.0.0...v2.1.0)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: docker/setup-buildx-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: slsa-framework/slsa-github-generator
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-03 17:16:53 +01:00
dependabot[bot] 5bef4a6611 build(deps): bump the gomod group across 1 directory with 6 updates
Bumps the gomod group with 5 updates in the / directory:

| Package | From | To |
| --- | --- | --- |
| [github.com/Azure/azure-sdk-for-go/sdk/azidentity](https://github.com/Azure/azure-sdk-for-go) | `1.8.1` | `1.8.2` |
| [github.com/nats-io/nats.go](https://github.com/nats-io/nats.go) | `1.39.0` | `1.39.1` |
| [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) | `9.7.0` | `9.7.1` |
| [k8s.io/api](https://github.com/kubernetes/api) | `0.32.1` | `0.32.2` |
| [k8s.io/client-go](https://github.com/kubernetes/client-go) | `0.32.1` | `0.32.2` |



Updates `github.com/Azure/azure-sdk-for-go/sdk/azidentity` from 1.8.1 to 1.8.2
- [Release notes](https://github.com/Azure/azure-sdk-for-go/releases)
- [Changelog](https://github.com/Azure/azure-sdk-for-go/blob/main/documentation/release.md)
- [Commits](https://github.com/Azure/azure-sdk-for-go/compare/sdk/azidentity/v1.8.1...sdk/azidentity/v1.8.2)

Updates `github.com/nats-io/nats.go` from 1.39.0 to 1.39.1
- [Release notes](https://github.com/nats-io/nats.go/releases)
- [Commits](https://github.com/nats-io/nats.go/compare/v1.39.0...v1.39.1)

Updates `github.com/redis/go-redis/v9` from 9.7.0 to 9.7.1
- [Release notes](https://github.com/redis/go-redis/releases)
- [Changelog](https://github.com/redis/go-redis/blob/master/CHANGELOG.md)
- [Commits](https://github.com/redis/go-redis/compare/v9.7.0...v9.7.1)

Updates `k8s.io/api` from 0.32.1 to 0.32.2
- [Commits](https://github.com/kubernetes/api/compare/v0.32.1...v0.32.2)

Updates `k8s.io/apimachinery` from 0.32.1 to 0.32.2
- [Commits](https://github.com/kubernetes/apimachinery/compare/v0.32.1...v0.32.2)

Updates `k8s.io/client-go` from 0.32.1 to 0.32.2
- [Changelog](https://github.com/kubernetes/client-go/blob/master/CHANGELOG.md)
- [Commits](https://github.com/kubernetes/client-go/compare/v0.32.1...v0.32.2)

---
updated-dependencies:
- dependency-name: github.com/Azure/azure-sdk-for-go/sdk/azidentity
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
- dependency-name: github.com/nats-io/nats.go
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
- dependency-name: github.com/redis/go-redis/v9
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
- dependency-name: k8s.io/api
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
- dependency-name: k8s.io/apimachinery
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
- dependency-name: k8s.io/client-go
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-24 19:18:17 +01:00
dependabot[bot] 20586b04d1 build(deps): bump sigstore/cosign-installer in the actions group
Bumps the actions group with 1 update: [sigstore/cosign-installer](https://github.com/sigstore/cosign-installer).


Updates `sigstore/cosign-installer` from 3.8.0 to 3.8.1
- [Release notes](https://github.com/sigstore/cosign-installer/releases)
- [Commits](c56c2d3e59...d7d6bc7722)

---
updated-dependencies:
- dependency-name: sigstore/cosign-installer
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-24 18:04:16 +01:00
Carlos Tadeu Panato Junior 57f110769c Update .golangci.yml
Signed-off-by: Carlos Tadeu Panato Junior <ctadeu@gmail.com>
2025-02-18 18:18:39 +01:00
Carlos Tadeu Panato Junior 1ddbe5af26 Update .golangci.yml
Signed-off-by: Carlos Tadeu Panato Junior <ctadeu@gmail.com>
2025-02-18 18:18:39 +01:00
Carlos Tadeu Panato Junior 9d7389b218 Update .golangci.yml
Signed-off-by: Carlos Tadeu Panato Junior <ctadeu@gmail.com>
2025-02-18 18:18:39 +01:00
dependabot[bot] 2d6cd852f6 build(deps): bump the actions group with 3 updates
Bumps the actions group with 3 updates: [goreleaser/goreleaser-action](https://github.com/goreleaser/goreleaser-action), [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) and [aws-actions/configure-aws-credentials](https://github.com/aws-actions/configure-aws-credentials).


Updates `goreleaser/goreleaser-action` from 6.1.0 to 6.2.1
- [Release notes](https://github.com/goreleaser/goreleaser-action/releases)
- [Commits](9ed2f89a66...90a3faa9d0)

Updates `golangci/golangci-lint-action` from 6.3.2 to 6.5.0
- [Release notes](https://github.com/golangci/golangci-lint-action/releases)
- [Commits](051d919338...2226d7cb06)

Updates `aws-actions/configure-aws-credentials` from 4.0.3 to 4.1.0
- [Release notes](https://github.com/aws-actions/configure-aws-credentials/releases)
- [Changelog](https://github.com/aws-actions/configure-aws-credentials/blob/main/CHANGELOG.md)
- [Commits](4fc4975a85...ececac1a45)

---
updated-dependencies:
- dependency-name: goreleaser/goreleaser-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: golangci/golangci-lint-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: aws-actions/configure-aws-credentials
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-18 18:18:39 +01:00
dependabot[bot] afca84ff4c build(deps): bump google.golang.org/api from 0.219.0 to 0.220.0
Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.219.0 to 0.220.0.
- [Release notes](https://github.com/googleapis/google-api-go-client/releases)
- [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md)
- [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.219.0...v0.220.0)

---
updated-dependencies:
- dependency-name: google.golang.org/api
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-10 17:49:53 +01:00
dependabot[bot] f31b161e6d build(deps): bump golang.org/x/text from 0.21.0 to 0.22.0
Bumps [golang.org/x/text](https://github.com/golang/text) from 0.21.0 to 0.22.0.
- [Release notes](https://github.com/golang/text/releases)
- [Commits](https://github.com/golang/text/compare/v0.21.0...v0.22.0)

---
updated-dependencies:
- dependency-name: golang.org/x/text
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-10 17:27:53 +01:00
dependabot[bot] 208e2c3118 build(deps): bump github.com/nats-io/nats.go from 1.38.0 to 1.39.0
Bumps [github.com/nats-io/nats.go](https://github.com/nats-io/nats.go) from 1.38.0 to 1.39.0.
- [Release notes](https://github.com/nats-io/nats.go/releases)
- [Commits](https://github.com/nats-io/nats.go/compare/v1.38.0...v1.39.0)

---
updated-dependencies:
- dependency-name: github.com/nats-io/nats.go
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-10 17:26:53 +01:00
dependabot[bot] 2d9d7ca9b0 build(deps): bump golang.org/x/oauth2 from 0.25.0 to 0.26.0
Bumps [golang.org/x/oauth2](https://github.com/golang/oauth2) from 0.25.0 to 0.26.0.
- [Commits](https://github.com/golang/oauth2/compare/v0.25.0...v0.26.0)

---
updated-dependencies:
- dependency-name: golang.org/x/oauth2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-10 16:56:53 +01:00
dependabot[bot] 2d68bae30c build(deps): bump the actions group with 4 updates
Bumps the actions group with 4 updates: [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action), [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action), [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) and [sigstore/cosign-installer](https://github.com/sigstore/cosign-installer).


Updates `docker/setup-qemu-action` from 3.3.0 to 3.4.0
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](53851d1459...4574d27a47)

Updates `docker/setup-buildx-action` from 3.8.0 to 3.9.0
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](6524bf65af...f7ce87c1d6)

Updates `golangci/golangci-lint-action` from 6.2.0 to 6.3.2
- [Release notes](https://github.com/golangci/golangci-lint-action/releases)
- [Commits](ec5d18412c...051d919338)

Updates `sigstore/cosign-installer` from 3.7.0 to 3.8.0
- [Release notes](https://github.com/sigstore/cosign-installer/releases)
- [Commits](dc72c7d5c4...c56c2d3e59)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: docker/setup-buildx-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: golangci/golangci-lint-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: sigstore/cosign-installer
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-10 16:55:53 +01:00
Thomas Labarussias 20a4ffbe04 prepare v2.31.1
Signed-off-by: Thomas Labarussias <issif_github@gadz.org>
2025-02-04 11:54:14 +01:00
Chanukya Y 632252b427 Adding scope ScopeReadWrite for uploading file for GCS Bucket
Signed-off-by: Chanukya Y <chanukya.yekollu@exabeam.com>
2025-02-04 11:00:14 +01:00
dependabot[bot] 5af88e588a build(deps): bump the actions group with 3 updates
Bumps the actions group with 3 updates: [actions/setup-go](https://github.com/actions/setup-go), [anchore/sbom-action](https://github.com/anchore/sbom-action) and [aws-actions/configure-aws-credentials](https://github.com/aws-actions/configure-aws-credentials).


Updates `actions/setup-go` from 5.2.0 to 5.3.0
- [Release notes](https://github.com/actions/setup-go/releases)
- [Commits](3041bf56c9...f111f3307d)

Updates `anchore/sbom-action` from 0.17.9 to 0.18.0
- [Release notes](https://github.com/anchore/sbom-action/releases)
- [Changelog](https://github.com/anchore/sbom-action/blob/main/RELEASE.md)
- [Commits](df80a981bc...f325610c9f)

Updates `aws-actions/configure-aws-credentials` from 4.0.2 to 4.0.3
- [Release notes](https://github.com/aws-actions/configure-aws-credentials/releases)
- [Changelog](https://github.com/aws-actions/configure-aws-credentials/blob/main/CHANGELOG.md)
- [Commits](e3dd6a429d...4fc4975a85)

---
updated-dependencies:
- dependency-name: actions/setup-go
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: anchore/sbom-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: aws-actions/configure-aws-credentials
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-03 16:44:08 +01:00
dependabot[bot] 0adfae2f3a build(deps): bump cloud.google.com/go/pubsub from 1.45.3 to 1.47.0
Bumps [cloud.google.com/go/pubsub](https://github.com/googleapis/google-cloud-go) from 1.45.3 to 1.47.0.
- [Release notes](https://github.com/googleapis/google-cloud-go/releases)
- [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md)
- [Commits](https://github.com/googleapis/google-cloud-go/compare/pubsub/v1.45.3...pubsub/v1.47.0)

---
updated-dependencies:
- dependency-name: cloud.google.com/go/pubsub
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-03 16:31:09 +01:00
Thomas Labarussias 9984c05528 prepare v2.31.0
Signed-off-by: Thomas Labarussias <issif_github@gadz.org>
2025-02-03 14:44:07 +01:00
Thomas Labarussias cd40babe7b add new output OTLP Logs + improve the OTLP Traces/Metrics
Signed-off-by: Thomas Labarussias <issif_github@gadz.org>
2025-02-03 13:27:07 +01:00
Rubens Farias 4ebc68ce71 fix typo
Signed-off-by: Rubens Farias <rubens.mbfarias@gmail.com>
2025-01-31 18:21:52 +01:00
Rubens Farias dc19ba5c6e Update handlers to match stats_prometheus.go
https://github.com/falcosecurity/falcosidekick/pull/1051 updated stats_prometheus.go to replace `.` for `_`, but the code that then adds the labels to every instance did not update it, so instances where CUSTOM_FIELDS is set to use a key with `.`s leads to panics.

Signed-off-by: Rubens Farias <rubens.mbfarias@gmail.com>
2025-01-31 18:21:52 +01:00
Linus Roepert 4a634b07ce fix custom headers not added to loki output http/s requests
Signed-off-by: Linus Roepert <linus.roepert@gmail.com>
2025-01-29 11:53:38 +01:00
Thomas Labarussias 58ec197423 fix Falcosidekick name for consistency
Signed-off-by: Thomas Labarussias <issif_github@gadz.org>
2025-01-27 16:02:32 +01:00
Thomas Labarussias 61bb03a8a6 change the printer for the logs
Signed-off-by: Thomas Labarussias <issif_github@gadz.org>
2025-01-27 16:02:32 +01:00
Thomas Labarussias 82c2465f22 allow to set the format for the value in Loki log lines
Signed-off-by: Thomas Labarussias <issif_github@gadz.org>
2025-01-27 15:31:32 +01:00
Thomas Labarussias d2c881d3a6 replace dots . by underscores . in Loki labels for consistency
Signed-off-by: Thomas Labarussias <issif_github@gadz.org>
2025-01-27 15:31:32 +01:00
Thomas Labarussias 6a29f66ca4 add templated fields in Loki and Prometheus outputs
Signed-off-by: Thomas Labarussias <issif_github@gadz.org>
2025-01-27 15:31:32 +01:00
Thomas Labarussias d85471787a use a global method for the logs
Signed-off-by: Thomas Labarussias <issif_github@gadz.org>
2025-01-27 11:48:32 +01:00
Thomas Labarussias b1f3b1aab6 fix the failing creation of the cluster policy report
Signed-off-by: Thomas Labarussias <issif_github@gadz.org>
2025-01-23 16:30:08 +01:00
Thomas Labarussias b6cd41a2dc allow to set a template for the nats/stan subjects
Signed-off-by: Thomas Labarussias <issif_github@gadz.org>
2025-01-23 13:37:07 +01:00
dependabot[bot] 2424be2710 build(deps): bump go.opentelemetry.io/otel/sdk from 1.33.0 to 1.34.0
Bumps [go.opentelemetry.io/otel/sdk](https://github.com/open-telemetry/opentelemetry-go) from 1.33.0 to 1.34.0.
- [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.33.0...v1.34.0)

---
updated-dependencies:
- dependency-name: go.opentelemetry.io/otel/sdk
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-20 17:11:49 +01:00
dependabot[bot] c4fbe29f56 build(deps): bump the gomod group with 2 updates
Bumps the gomod group with 2 updates: [github.com/Azure/azure-sdk-for-go/sdk/azidentity](https://github.com/Azure/azure-sdk-for-go) and [github.com/aws/aws-sdk-go](https://github.com/aws/aws-sdk-go).


Updates `github.com/Azure/azure-sdk-for-go/sdk/azidentity` from 1.8.0 to 1.8.1
- [Release notes](https://github.com/Azure/azure-sdk-for-go/releases)
- [Changelog](https://github.com/Azure/azure-sdk-for-go/blob/main/documentation/release.md)
- [Commits](https://github.com/Azure/azure-sdk-for-go/compare/sdk/azcore/v1.8.0...sdk/azidentity/v1.8.1)

Updates `github.com/aws/aws-sdk-go` from 1.55.5 to 1.55.6
- [Release notes](https://github.com/aws/aws-sdk-go/releases)
- [Changelog](https://github.com/aws/aws-sdk-go/blob/main/CHANGELOG_PENDING.md)
- [Commits](https://github.com/aws/aws-sdk-go/compare/v1.55.5...v1.55.6)

---
updated-dependencies:
- dependency-name: github.com/Azure/azure-sdk-for-go/sdk/azidentity
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
- dependency-name: github.com/aws/aws-sdk-go
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-20 17:02:49 +01:00
dependabot[bot] 520277ddc0 build(deps): bump golangci/golangci-lint-action in the actions group
Bumps the actions group with 1 update: [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action).


Updates `golangci/golangci-lint-action` from 6.1.1 to 6.2.0
- [Release notes](https://github.com/golangci/golangci-lint-action/releases)
- [Commits](971e284b60...ec5d18412c)

---
updated-dependencies:
- dependency-name: golangci/golangci-lint-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-20 16:26:49 +01:00
afreyermuth98 b58c9c4273 🐛 Removed size allocation for the loki map
Signed-off-by: afreyermuth98 <anthofreyer@gmail.com>
2025-01-17 12:05:32 +01:00
afreyermuth98 6b77b6b479 🎨 Go fmt
Signed-off-by: afreyermuth98 <anthofreyer@gmail.com>
2025-01-17 12:05:32 +01:00
afreyermuth98 ce030d7ee4 🔧 Add NS and pod by default in loki output
Signed-off-by: afreyermuth98 <anthofreyer@gmail.com>
2025-01-17 12:05:32 +01:00
dependabot[bot] 20c3c50109 build(deps): bump docker/setup-qemu-action in the actions group
Bumps the actions group with 1 update: [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action).


Updates `docker/setup-qemu-action` from 3.2.0 to 3.3.0
- [Release notes](https://github.com/docker/setup-qemu-action/releases)
- [Commits](49b3bc8e6b...53851d1459)

---
updated-dependencies:
- dependency-name: docker/setup-qemu-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-13 16:27:40 +01:00
Thomas Labarussias 7e4eca8fe9 remove debug line -_-
Signed-off-by: Thomas Labarussias <issif_github@gadz.org>
2025-01-07 13:55:34 +01:00
dependabot[bot] d49dfc794e build(deps): bump golang.org/x/oauth2 from 0.24.0 to 0.25.0
Bumps [golang.org/x/oauth2](https://github.com/golang/oauth2) from 0.24.0 to 0.25.0.
- [Commits](https://github.com/golang/oauth2/compare/v0.24.0...v0.25.0)

---
updated-dependencies:
- dependency-name: golang.org/x/oauth2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-06 17:02:29 +01:00
dependabot[bot] 9724de340e build(deps): bump google.golang.org/api from 0.211.0 to 0.214.0
Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.211.0 to 0.214.0.
- [Release notes](https://github.com/googleapis/google-api-go-client/releases)
- [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md)
- [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.211.0...v0.214.0)

---
updated-dependencies:
- dependency-name: google.golang.org/api
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-30 16:24:49 +01:00
dependabot[bot] b792daf085 build(deps): bump github.com/nats-io/nats.go from 1.37.0 to 1.38.0
Bumps [github.com/nats-io/nats.go](https://github.com/nats-io/nats.go) from 1.37.0 to 1.38.0.
- [Release notes](https://github.com/nats-io/nats.go/releases)
- [Commits](https://github.com/nats-io/nats.go/compare/v1.37.0...v1.38.0)

---
updated-dependencies:
- dependency-name: github.com/nats-io/nats.go
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-24 10:51:17 +01:00
dependabot[bot] 304d59796f build(deps): bump go.opentelemetry.io/otel/sdk/metric
Bumps [go.opentelemetry.io/otel/sdk/metric](https://github.com/open-telemetry/opentelemetry-go) from 1.32.0 to 1.33.0.
- [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.32.0...v1.33.0)

---
updated-dependencies:
- dependency-name: go.opentelemetry.io/otel/sdk/metric
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-23 20:38:13 +01:00
dependabot[bot] 2bdb8355ea build(deps): bump the gomod group with 3 updates
Bumps the gomod group with 3 updates: [github.com/googleapis/gax-go/v2](https://github.com/googleapis/gax-go), [github.com/jackc/pgx/v5](https://github.com/jackc/pgx) and [google.golang.org/api](https://github.com/googleapis/google-api-go-client).


Updates `github.com/googleapis/gax-go/v2` from 2.14.0 to 2.14.1
- [Release notes](https://github.com/googleapis/gax-go/releases)
- [Commits](https://github.com/googleapis/gax-go/compare/v2.14.0...v2.14.1)

Updates `github.com/jackc/pgx/v5` from 5.7.1 to 5.7.2
- [Changelog](https://github.com/jackc/pgx/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jackc/pgx/compare/v5.7.1...v5.7.2)

Updates `google.golang.org/api` from 0.210.0 to 0.211.0
- [Release notes](https://github.com/googleapis/google-api-go-client/releases)
- [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md)
- [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.210.0...v0.211.0)

---
updated-dependencies:
- dependency-name: github.com/googleapis/gax-go/v2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
- dependency-name: github.com/jackc/pgx/v5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
- dependency-name: google.golang.org/api
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: gomod
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-23 18:17:12 +01:00
dependabot[bot] 2ddf8c518d build(deps): bump golang.org/x/crypto from 0.29.0 to 0.31.0
Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.29.0 to 0.31.0.
- [Commits](https://github.com/golang/crypto/compare/v0.29.0...v0.31.0)

---
updated-dependencies:
- dependency-name: golang.org/x/crypto
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-16 17:54:34 +01:00
dependabot[bot] ae60a86cac build(deps): bump the actions group with 3 updates
Bumps the actions group with 3 updates: [actions/setup-go](https://github.com/actions/setup-go), [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) and [anchore/sbom-action](https://github.com/anchore/sbom-action).


Updates `actions/setup-go` from 5.1.0 to 5.2.0
- [Release notes](https://github.com/actions/setup-go/releases)
- [Commits](41dfa10bad...3041bf56c9)

Updates `docker/setup-buildx-action` from 3.7.1 to 3.8.0
- [Release notes](https://github.com/docker/setup-buildx-action/releases)
- [Commits](c47758b77c...6524bf65af)

Updates `anchore/sbom-action` from 0.17.8 to 0.17.9
- [Release notes](https://github.com/anchore/sbom-action/releases)
- [Changelog](https://github.com/anchore/sbom-action/blob/main/RELEASE.md)
- [Commits](55dc4ee224...df80a981bc)

---
updated-dependencies:
- dependency-name: actions/setup-go
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: docker/setup-buildx-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: anchore/sbom-action
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-16 17:53:34 +01:00
dependabot[bot] 5c158a93e1 build(deps): bump golang.org/x/text from 0.20.0 to 0.21.0
Bumps [golang.org/x/text](https://github.com/golang/text) from 0.20.0 to 0.21.0.
- [Release notes](https://github.com/golang/text/releases)
- [Commits](https://github.com/golang/text/compare/v0.20.0...v0.21.0)

---
updated-dependencies:
- dependency-name: golang.org/x/text
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-16 17:52:34 +01:00
dependabot[bot] 9e10e874f2 build(deps): bump go.opentelemetry.io/otel/metric from 1.32.0 to 1.33.0
Bumps [go.opentelemetry.io/otel/metric](https://github.com/open-telemetry/opentelemetry-go) from 1.32.0 to 1.33.0.
- [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.32.0...v1.33.0)

---
updated-dependencies:
- dependency-name: go.opentelemetry.io/otel/metric
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-16 17:39:34 +01:00
dependabot[bot] 97c89d368b build(deps): bump golang.org/x/sync from 0.9.0 to 0.10.0
Bumps [golang.org/x/sync](https://github.com/golang/sync) from 0.9.0 to 0.10.0.
- [Commits](https://github.com/golang/sync/compare/v0.9.0...v0.10.0)

---
updated-dependencies:
- dependency-name: golang.org/x/sync
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-09 17:23:58 +01:00
dependabot[bot] 21f4b096e6 build(deps): bump cloud.google.com/go/pubsub
Bumps the gomod group with 1 update in the / directory: [cloud.google.com/go/pubsub](https://github.com/googleapis/google-cloud-go).


Updates `cloud.google.com/go/pubsub` from 1.45.1 to 1.45.3
- [Release notes](https://github.com/googleapis/google-cloud-go/releases)
- [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md)
- [Commits](https://github.com/googleapis/google-cloud-go/compare/pubsub/v1.45.1...pubsub/v1.45.3)

---
updated-dependencies:
- dependency-name: cloud.google.com/go/pubsub
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: gomod
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-09 17:22:58 +01:00
dependabot[bot] 7f3654b2cc build(deps): bump cloud.google.com/go/storage from 1.47.0 to 1.48.0
Bumps [cloud.google.com/go/storage](https://github.com/googleapis/google-cloud-go) from 1.47.0 to 1.48.0.
- [Release notes](https://github.com/googleapis/google-cloud-go/releases)
- [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md)
- [Commits](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.47.0...spanner/v1.48.0)

---
updated-dependencies:
- dependency-name: cloud.google.com/go/storage
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-09 16:56:57 +01:00
Thomas Labarussias ca111495cd remove the log line for OTLP Metrics (too noisy)
Signed-off-by: Thomas Labarussias <issif_github@gadz.org>
2024-12-03 21:10:28 +01:00
93 changed files with 1917 additions and 1131 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -10,7 +10,7 @@ env:
- COSIGN_YES=true
snapshot:
name_template: 'latest'
version_template: 'latest'
checksum:
name_template: 'checksums.txt'

View File

@ -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))

View File

@ -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

View File

@ -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
}

View File

@ -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: [])

51
docs/outputs/logstash.md Normal file
View File

@ -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

View File

@ -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

View File

@ -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
![mattermost example](images/mattermost.png)
![mattermost example](images/mattermost.png)

View File

@ -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)
```

51
docs/outputs/otlp_logs.md Normal file
View File

@ -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.

View File

@ -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"
]

View File

@ -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:

View File

@ -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
View File

@ -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
View File

@ -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=

View File

@ -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)
}
}

View File

@ -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) {

View File

@ -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
View File

@ -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())
}
}
}

View File

@ -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, ".", "_"))

View File

@ -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
}

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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
}

View File

@ -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
}

View File

@ -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{

View File

@ -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")
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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) {

View File

@ -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
}

View File

@ -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()

View File

@ -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()

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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)))
}
}

View File

@ -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
}

View File

@ -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()

149
outputs/logstash.go Normal file
View File

@ -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))
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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()

View File

@ -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
}

View File

@ -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

View File

@ -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
}

View File

@ -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()

View File

@ -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
}

View File

@ -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
}

121
outputs/otlp_logs.go Normal file
View File

@ -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")
}

View File

@ -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")
}

View File

@ -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) {

View File

@ -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())
}
}

View File

@ -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) {

View File

@ -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 {

View File

@ -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
}
}

View File

@ -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
}

View File

@ -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()

View File

@ -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",

View File

@ -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
}

View File

@ -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
}

View File

@ -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)
}

View File

@ -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
}

View File

@ -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

View File

@ -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))
}
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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()
}

View File

@ -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
}

View File

@ -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",

View File

@ -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
}

View File

@ -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
}

View File

@ -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))
}
}

View File

@ -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))
}
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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()

View File

@ -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
}

View File

@ -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)

View File

@ -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, ".", "_"))

View File

@ -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