Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 14 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,21 +66,30 @@ finchctl service deploy \
```bash
finchctl agent register \
--agent.hostname sparrow.example.com \
--agent.log.journal finch.example.com
--agent.logs.journal finch.example.com
```

This registers a new agent for the specified Finch service.
The agent config file is saved as `finch-agent.cfg`, ready to deploy, including
all endpoints and credentials. By default, it sends systemd journal records.

You can also collect logs from Docker containers (`--agent.log.docker`) and
files (`--agent.log.file /var/log/*.log`). Metrics can be included via
`--agent.metrics`.
You can also collect logs from Docker containers (`--agents.log.docker`) and
files (`--agent.logs.file /var/log/*.log`). Node metrics can be included via
`--agent.metrics` and metrics targets to scrape can be added with
`--agent.metrics.targets <target>`. Profiling data collection can be enabled
with `--agent.profiles`.

Alternatively, you can register an agent with a [configuration
file](contrib/agent-file.yml):

```bash
finchctl agent register --agent.file agent-file.yml finch.example.com
```

To deploy the agent:

```bash
finchctl agent deploy --config finch-agent.cfg root@app.machine
finchctl agent deploy --agent.config finch-agent.cfg root@app.machine
```

Alloy will be enrolled and started with the provided configuration.
Expand Down
16 changes: 8 additions & 8 deletions cmd/agent/describe.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,16 +60,16 @@ func runDescribeCmd(cmd *cobra.Command, args []string) {
if (len(desc.Labels)) > 0 {
_ = t.Append([]string{"Labels", strings.Join(desc.Labels, ", ")})
}
_ = t.Append([]string{"Journal", fmt.Sprintf("%v", desc.Journal)})
_ = t.Append([]string{"Docker", fmt.Sprintf("%v", desc.Docker)})
_ = t.Append([]string{"Metrics", fmt.Sprintf("%v", desc.Metrics)})
_ = t.Append([]string{"Profiles", fmt.Sprintf("%v", desc.Profiles)})
if (len(desc.Files)) > 0 {
_ = t.Append([]string{"Files", strings.Join(desc.Files, "\n")})
_ = t.Append([]string{"Docker", fmt.Sprintf("%v", desc.Logs.Docker.Enable)})
_ = t.Append([]string{"Journal", fmt.Sprintf("%v", desc.Logs.Journal.Enable)})
if (len(desc.Logs.Files)) > 0 {
_ = t.Append([]string{"Files", strings.Join(desc.Logs.Files, "\n")})
}
if (len(desc.MetricsTargets)) > 0 {
_ = t.Append([]string{"Metrics targets", strings.Join(desc.MetricsTargets, "\n")})
_ = t.Append([]string{"Metrics", fmt.Sprintf("%v", desc.Metrics.Enable)})
if (len(desc.Metrics.Targets)) > 0 {
_ = t.Append([]string{"Metrics targets", strings.Join(desc.Metrics.Targets, "\n")})
}
_ = t.Append([]string{"Profiles", fmt.Sprintf("%v", desc.Profiles.Enable)})
_ = t.Render()
}
}
76 changes: 60 additions & 16 deletions cmd/agent/register.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@ Licensed under the MIT license, see LICENSE in the project root for details.
package agent

import (
"fmt"
"os"

"github.com/spf13/cobra"
"github.com/spf13/viper"
"github.com/tschaefer/finchctl/cmd/completion"
"github.com/tschaefer/finchctl/cmd/errors"
"github.com/tschaefer/finchctl/cmd/format"
Expand All @@ -19,28 +21,52 @@ var registerCmd = &cobra.Command{
Use: "register service-name",
Short: "Register a new agent with a finch service",
Args: cobra.ExactArgs(1),
PreRun: runRegisterPreCmd,
Run: runRegisterCmd,
ValidArgsFunction: completion.CompleteStackName,
}

func init() {
registerCmd.Flags().String("agent.hostname", "", "Hostname of the agent")
registerCmd.Flags().Bool("agent.log.journal", false, "Collect journal logs")
registerCmd.Flags().Bool("agent.log.docker", false, "Collect docker logs")
_ = viper.BindPFlag("hostname", registerCmd.Flags().Lookup("agent.hostname"))

registerCmd.Flags().Bool("agent.logs.journal", false, "Collect journal logs")
_ = viper.BindPFlag("logs.journal.enable", registerCmd.Flags().Lookup("agent.logs.journal"))

registerCmd.Flags().Bool("agent.logs.docker", false, "Collect docker logs")
_ = viper.BindPFlag("logs.docker.enable", registerCmd.Flags().Lookup("agent.logs.docker"))

registerCmd.Flags().Bool("agent.metrics", false, "Collect node metrics")
registerCmd.Flags().StringSlice("agent.metrics.target", nil, "Collect metrics from specific targets")
_ = viper.BindPFlag("metrics.enable", registerCmd.Flags().Lookup("agent.metrics"))

registerCmd.Flags().StringSlice("agent.metrics.targets", nil, "Collect metrics from specific targets")
_ = viper.BindPFlag("metrics.targets", registerCmd.Flags().Lookup("agent.metrics.targets"))

registerCmd.Flags().Bool("agent.profiles", false, "Enable profiles collector")
registerCmd.Flags().StringSlice("agent.log.file", nil, "Collect logs from file paths")
_ = viper.BindPFlag("profiles.enable", registerCmd.Flags().Lookup("agent.profiles"))

registerCmd.Flags().StringSlice("agent.logs.files", nil, "Collect logs from file paths")
_ = viper.BindPFlag("logs.files", registerCmd.Flags().Lookup("agent.logs.files"))

registerCmd.Flags().StringSlice("agent.labels", nil, "Optional labels for identifying the agent")
_ = viper.BindPFlag("labels", registerCmd.Flags().Lookup("agent.labels"))

registerCmd.Flags().String("agent.config", "finch-agent.cfg", "Path to the configuration file")
registerCmd.Flags().String("agent.file", "", "Path to a file containing agent data")
}

func runRegisterPreCmd(cmd *cobra.Command, args []string) {
agentFile, _ := cmd.Flags().GetString("agent.file")
err := initConfig(agentFile)
cobra.CheckErr(err)
}

func runRegisterCmd(cmd *cobra.Command, args []string) {
formatType, err := format.GetRunFormat("quiet")
cobra.CheckErr(err)

serviceName := args[0]
data := parseFlags(cmd, formatType)
data := parseFlags(formatType)

a, err := agent.New("", "localhost", formatType, false)
cobra.CheckErr(err)
Expand All @@ -55,25 +81,23 @@ func runRegisterCmd(cmd *cobra.Command, args []string) {
}
}

func parseFlags(cmd *cobra.Command, formatType target.Format) *agent.RegisterData {
hostname, _ := cmd.Flags().GetString("agent.hostname")
func parseFlags(formatType target.Format) *agent.RegisterData {
hostname := viper.GetString("hostname")
if hostname == "" {
errors.CheckErr("agent hostname is required", formatType)
}

var logSources []string

logJournal, _ := cmd.Flags().GetBool("agent.log.journal")
if logJournal {
if viper.GetBool("logs.journal.enable") {
logSources = append(logSources, "journal://")
}

logDocker, _ := cmd.Flags().GetBool("agent.log.docker")
if logDocker {
if viper.GetBool("logs.docker.enable") {
logSources = append(logSources, "docker://")
}

logFiles, _ := cmd.Flags().GetStringSlice("agent.log.file")
logFiles := viper.GetStringSlice("logs.files")
if len(logFiles) != 0 {
for _, file := range logFiles {
logSources = append(logSources, "file://"+file)
Expand All @@ -84,10 +108,14 @@ func parseFlags(cmd *cobra.Command, formatType target.Format) *agent.RegisterDat
errors.CheckErr("at least one log source must be enabled", formatType)
}

labels, _ := cmd.Flags().GetStringSlice("agent.labels")
metrics, _ := cmd.Flags().GetBool("agent.metrics")
metricsTargets, _ := cmd.Flags().GetStringSlice("agent.metrics.target")
profiles, _ := cmd.Flags().GetBool("agent.profiles")
labels := viper.GetStringSlice("labels")
metrics := viper.GetBool("metrics.enable")
metricsTargets := viper.GetStringSlice("metrics.targets")
profiles := viper.GetBool("profiles.enable")

if len(metricsTargets) != 0 && !viper.IsSet("metrics.enable") {
metrics = true
}

data := &agent.RegisterData{
Hostname: hostname,
Expand All @@ -100,3 +128,19 @@ func parseFlags(cmd *cobra.Command, formatType target.Format) *agent.RegisterDat

return data
}

func initConfig(cfgFile string) error {
if cfgFile == "" {
return nil
}
viper.SetConfigFile(cfgFile)

if err := viper.ReadInConfig(); err != nil {
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
return fmt.Errorf("config file not found: %w", err)
}
return fmt.Errorf("error reading config file: %w", err)
}

return nil
}
38 changes: 38 additions & 0 deletions contrib/agent-file.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Agent configuration file
#
# This is a sample configuration file used to register a new observability
# agent.
#
# Apply it with the following command:
# finchctl agent register --agent.file agent-file.yml finch.example.com
---

# Unique hostname
hostname: sparrow.example.com

# Log sources
# At least one source is required
logs:
# Collect systemd journal logs
journal:
enable: true

# Collect Docker logs
docker:
enable: true

# Collect log files
files:
- /var/log/*.log
- /var/log/nginx/access.log

# Collect node metrics (optional)
metrics:
enable: true
# Scrape metrics from custom endpoints
targets:
- http://localhost:9100/metrics

# Enable profiling (optional)
profiles:
enable: true
14 changes: 12 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ require (
github.com/melbahja/goph v1.4.0
github.com/olekukonko/tablewriter v1.1.0
github.com/spf13/cobra v1.9.1
github.com/stretchr/testify v1.10.0
github.com/spf13/viper v1.21.0
github.com/stretchr/testify v1.11.1
golang.org/x/crypto v0.45.0
golang.org/x/term v0.37.0
google.golang.org/grpc v1.77.0
Expand All @@ -17,18 +18,27 @@ require (
require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/fatih/color v1.15.0 // indirect
github.com/fsnotify/fsnotify v1.9.0 // indirect
github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/kr/fs v0.1.0 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.19 // indirect
github.com/mattn/go-runewidth v0.0.16 // indirect
github.com/olekukonko/errors v1.1.0 // indirect
github.com/olekukonko/ll v0.0.9 // indirect
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pkg/sftp v1.13.5 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/spf13/pflag v1.0.6 // indirect
github.com/sagikazarmark/locafero v0.11.0 // indirect
github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect
github.com/spf13/afero v1.15.0 // indirect
github.com/spf13/cast v1.10.0 // indirect
github.com/spf13/pflag v1.0.10 // indirect
github.com/subosito/gotenv v1.6.0 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
golang.org/x/net v0.47.0 // indirect
golang.org/x/sys v0.38.0 // indirect
golang.org/x/text v0.31.0 // indirect
Expand Down
38 changes: 34 additions & 4 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,16 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs=
github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw=
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.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
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-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs=
github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
Expand All @@ -20,6 +26,10 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8=
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
Expand All @@ -35,6 +45,8 @@ github.com/olekukonko/ll v0.0.9 h1:Y+1YqDfVkqMWuEQMclsF9HUR5+a82+dxJuL1HHSRpxI=
github.com/olekukonko/ll v0.0.9/go.mod h1:En+sEW0JNETl26+K8eZ6/W4UQ7CYSrrgg/EdIYT2H8g=
github.com/olekukonko/tablewriter v1.1.0 h1:N0LHrshF4T39KvI96fn6GT8HEjXRXYNDrDjKFDB7RIY=
github.com/olekukonko/tablewriter v1.1.0/go.mod h1:5c+EBPeSqvXnLLgkm9isDdzR3wjfBkHR9Nhfp3NWrzo=
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/sftp v1.13.5 h1:a3RLUqkyjYRtBTZJZ1VRrKbN3zhuPLlUc3sphVz81go=
Expand All @@ -44,15 +56,30 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDcg+AAIFXc=
github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik=
github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw=
github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U=
github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I=
github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg=
github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY=
github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo=
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
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/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU=
github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
Expand All @@ -66,6 +93,8 @@ go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6
go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA=
go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE=
go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs=
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
Expand Down Expand Up @@ -118,8 +147,9 @@ google.golang.org/grpc v1.77.0 h1:wVVY6/8cGA6vvffn+wWK5ToddbgdU3d8MNENr4evgXM=
google.golang.org/grpc v1.77.0/go.mod h1:z0BY1iVj0q8E1uSQCjL9cppRj+gnZjzDnzV0dHhrNig=
google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
Loading