Skip to content

Commit 6bd451c

Browse files
refactor to use agent config
1 parent 53beaf9 commit 6bd451c

29 files changed

+331
-248
lines changed

internal/commands/config/config.go

Lines changed: 5 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,12 @@ package config
66
import (
77
"context"
88
"fmt"
9-
"os"
10-
"strings"
119

12-
"github.com/go-viper/mapstructure/v2"
1310
"github.com/observeinc/observe-agent/internal/commands/start"
14-
logger "github.com/observeinc/observe-agent/internal/commands/util"
15-
"github.com/observeinc/observe-agent/internal/config"
11+
"github.com/observeinc/observe-agent/internal/commands/util"
12+
"github.com/observeinc/observe-agent/internal/commands/util/logger"
1613
"github.com/observeinc/observe-agent/internal/root"
17-
"github.com/observeinc/observe-agent/observecol"
1814
"github.com/spf13/cobra"
19-
"github.com/spf13/viper"
20-
"go.opentelemetry.io/collector/confmap"
21-
"go.opentelemetry.io/collector/otelcol"
22-
"gopkg.in/yaml.v3"
2315
)
2416

2517
var configCmd = &cobra.Command{
@@ -49,96 +41,14 @@ bundled OTel configuration.`,
4941
return err
5042
}
5143
if singleOtel {
52-
return printShortOtelConfig(ctx, configFilePaths)
44+
return util.PrintShortOtelConfig(ctx, configFilePaths)
5345
} else if detailedOtel {
54-
return printFullOtelConfig(configFilePaths)
46+
return util.PrintFullOtelConfig(configFilePaths)
5547
}
56-
return printAllConfigsIndividually(configFilePaths)
48+
return util.PrintAllConfigsIndividually(configFilePaths)
5749
},
5850
}
5951

60-
func printAllConfigsIndividually(configFilePaths []string) error {
61-
printConfig := func(comment string, data []byte) {
62-
fmt.Printf("# ======== %s\n", comment)
63-
fmt.Println(strings.Trim(string(data), "\n\t "))
64-
fmt.Println("---")
65-
}
66-
67-
agentConfig, err := config.AgentConfigFromViper(viper.GetViper())
68-
if err != nil {
69-
return err
70-
}
71-
agentConfigYaml, err := yaml.Marshal(agentConfig)
72-
if err != nil {
73-
return err
74-
}
75-
printConfig("computed agent config", agentConfigYaml)
76-
agentConfigFile := viper.ConfigFileUsed()
77-
if agentConfigFile != "" {
78-
configFilePaths = append([]string{agentConfigFile}, configFilePaths...)
79-
}
80-
for _, filePath := range configFilePaths {
81-
file, err := os.ReadFile(filePath)
82-
if err != nil {
83-
fmt.Fprintf(os.Stderr, "error reading config file %s: %s", filePath, err.Error())
84-
} else {
85-
printConfig("config file "+filePath, file)
86-
}
87-
}
88-
return nil
89-
}
90-
91-
func printShortOtelConfig(ctx context.Context, configFilePaths []string) error {
92-
if len(configFilePaths) == 0 {
93-
return nil
94-
}
95-
settings := observecol.ConfigProviderSettings(configFilePaths)
96-
resolver, err := confmap.NewResolver(settings.ResolverSettings)
97-
if err != nil {
98-
return fmt.Errorf("failed to create new resolver: %w", err)
99-
}
100-
conf, err := resolver.Resolve(ctx)
101-
if err != nil {
102-
return fmt.Errorf("error while resolving config: %w", err)
103-
}
104-
b, err := yaml.Marshal(conf.ToStringMap())
105-
if err != nil {
106-
return fmt.Errorf("error while marshaling to YAML: %w", err)
107-
}
108-
fmt.Printf("%s\n", b)
109-
return nil
110-
}
111-
112-
func printFullOtelConfig(configFilePaths []string) error {
113-
if len(configFilePaths) == 0 {
114-
return nil
115-
}
116-
colSettings := observecol.GenerateCollectorSettingsWithConfigFiles(configFilePaths)
117-
factories, err := colSettings.Factories()
118-
if err != nil {
119-
return fmt.Errorf("failed to create component factory maps: %w", err)
120-
}
121-
provider, err := otelcol.NewConfigProvider(colSettings.ConfigProviderSettings)
122-
if err != nil {
123-
return fmt.Errorf("failed to create config provider: %w", err)
124-
}
125-
cfg, err := provider.Get(context.Background(), factories)
126-
if err != nil {
127-
return fmt.Errorf("failed to get config: %w", err)
128-
}
129-
var cfgMap map[string]any
130-
err = mapstructure.Decode(cfg, &cfgMap)
131-
if err != nil {
132-
return fmt.Errorf("failed to marshall config to map: %w", err)
133-
}
134-
cfgYaml, err := yaml.Marshal(cfgMap)
135-
if err != nil {
136-
return fmt.Errorf("failed to marshall config to yaml: %w", err)
137-
}
138-
fmt.Printf("%s\n", cfgYaml)
139-
return nil
140-
}
141-
14252
func init() {
14353
configCmd.Flags().Bool("render-otel-details", false, "Print the full resolved otel configuration including default values after the otel components perform their semantic processing.")
14454
configCmd.Flags().Bool("render-otel", false, "Print a single rendered otel configuration file. This file is equivalent to the bundled configuration enabled in the observe-agent config.")

internal/commands/diagnose/agentstatuscheck.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"embed"
55

66
"github.com/observeinc/observe-agent/internal/commands/status"
7+
"github.com/observeinc/observe-agent/internal/config"
78
"github.com/spf13/viper"
89
)
910

@@ -14,7 +15,11 @@ type StatusTestResult struct {
1415
}
1516

1617
func checkStatus(v *viper.Viper) (bool, any, error) {
17-
data, err := status.GetStatusData(v.GetString(status.TelemetryEndpointFlag), v.GetString(status.HealthcheckEndpointFlag), v.GetString(status.HealthcheckPathFlag))
18+
conf, err := config.AgentConfigFromViper(v)
19+
if err != nil {
20+
return false, StatusTestResult{Error: err.Error()}, err
21+
}
22+
data, err := status.GetStatusData(conf)
1823
if err != nil {
1924
return false, StatusTestResult{
2025
Passed: false,

internal/commands/diagnose/diagnose.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
"os"
1010
"text/template"
1111

12-
"github.com/observeinc/observe-agent/internal/commands/status"
1312
"github.com/observeinc/observe-agent/internal/root"
1413
"github.com/spf13/cobra"
1514
"github.com/spf13/viper"
@@ -72,6 +71,5 @@ to attempt to identify issues that could cause the agent to function improperly.
7271
func init() {
7372
v := viper.GetViper()
7473
diagnoseCmd := NewDiagnoseCmd(v)
75-
status.RegisterStatusFlags(diagnoseCmd, v)
7674
root.RootCmd.AddCommand(diagnoseCmd)
7775
}

internal/commands/diagnose/otelconfigcheck.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
"embed"
66

77
"github.com/observeinc/observe-agent/internal/commands/start"
8-
logger "github.com/observeinc/observe-agent/internal/commands/util"
8+
"github.com/observeinc/observe-agent/internal/commands/util/logger"
99
"github.com/observeinc/observe-agent/observecol"
1010
"github.com/spf13/viper"
1111
"go.opentelemetry.io/collector/otelcol"

internal/commands/start/start.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
"os"
99
"strings"
1010

11-
logger "github.com/observeinc/observe-agent/internal/commands/util"
11+
"github.com/observeinc/observe-agent/internal/commands/util/logger"
1212
"github.com/observeinc/observe-agent/internal/connections"
1313
"github.com/observeinc/observe-agent/internal/root"
1414
"github.com/observeinc/observe-agent/observecol"

internal/commands/status/flags.go

Lines changed: 0 additions & 30 deletions
This file was deleted.

internal/commands/status/status.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"html/template"
99
"os"
1010

11+
"github.com/observeinc/observe-agent/internal/config"
1112
"github.com/observeinc/observe-agent/internal/connections"
1213
"github.com/observeinc/observe-agent/internal/root"
1314
"github.com/spf13/cobra"
@@ -35,12 +36,15 @@ func NewStatusCmd(v *viper.Viper) *cobra.Command {
3536
func init() {
3637
v := viper.GetViper()
3738
statusCmd := NewStatusCmd(v)
38-
RegisterStatusFlags(statusCmd, v)
3939
root.RootCmd.AddCommand(statusCmd)
4040
}
4141

4242
func getStatusFromTemplate(v *viper.Viper) error {
43-
data, err := GetStatusData(v.GetString(TelemetryEndpointFlag), v.GetString(HealthcheckEndpointFlag), v.GetString(HealthcheckPathFlag))
43+
conf, err := config.AgentConfigFromViper(v)
44+
if err != nil {
45+
return err
46+
}
47+
data, err := GetStatusData(conf)
4448
if err != nil {
4549
return err
4650
}

internal/commands/status/statusRetriever.go renamed to internal/commands/status/statusretriever.go

Lines changed: 41 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ import (
44
"errors"
55
"fmt"
66
"net/http"
7-
"net/url"
87
"os"
98
"strconv"
9+
"strings"
1010
"time"
1111

12+
"github.com/observeinc/observe-agent/internal/commands/util"
13+
"github.com/observeinc/observe-agent/internal/config"
1214
io_prometheus_client "github.com/prometheus/client_model/go"
1315
"github.com/prometheus/common/expfmt"
1416
"github.com/shirou/gopsutil/v3/host"
@@ -71,15 +73,15 @@ func bToMb(b float32) float32 {
7173
}
7274

7375
func GetAgentStatusFromHealthcheck(baseURL string, path string) (AgentStatus, error) {
76+
baseURL = util.ReplaceEnvString(baseURL)
77+
path = util.ReplaceEnvString(path)
7478
if len(path) == 0 || len(baseURL) == 0 {
7579
return NotRunning, errors.New("health_check endpoint and path must be provided")
7680
}
77-
if baseURL[len(baseURL)-1] == '/' {
78-
baseURL = baseURL[:len(baseURL)-1]
79-
}
80-
URL, err := url.JoinPath(baseURL, path)
81-
if err != nil {
82-
return NotRunning, err
81+
URL := util.JoinUrl(baseURL, path)
82+
// The healthcheck extension is always http
83+
if !strings.Contains(URL, "://") {
84+
URL = "http://" + URL
8385
}
8486

8587
c := &http.Client{}
@@ -106,17 +108,22 @@ func getMetricsSum(metrics []*io_prometheus_client.Metric) float64 {
106108
return sum
107109
}
108110

111+
func GetAgentMetrics(conf *config.AgentConfig) (*AgentMetrics, error) {
112+
host := util.ReplaceEnvString(conf.InternalTelemetry.Host)
113+
if !strings.Contains(host, "://") {
114+
host = "http://" + host
115+
}
116+
host = strings.TrimRight(host, ":/")
117+
port := conf.InternalTelemetry.Port
118+
baseURL := fmt.Sprintf("%s:%d", host, port)
119+
return GetAgentMetricsFromEndpoint(baseURL)
120+
}
121+
109122
func GetAgentMetricsFromEndpoint(baseURL string) (*AgentMetrics, error) {
110123
if len(baseURL) == 0 {
111124
return nil, errors.New("metrics endpoint must be provided")
112125
}
113-
if baseURL[len(baseURL)-1] == '/' {
114-
baseURL = baseURL[:len(baseURL)-1]
115-
}
116-
URL, err := url.JoinPath(baseURL, "/metrics")
117-
if err != nil {
118-
return nil, err
119-
}
126+
URL := util.JoinUrl(baseURL, "/metrics")
120127
c := &http.Client{}
121128
req, err := http.NewRequest("GET", URL, nil)
122129
if err != nil {
@@ -140,53 +147,53 @@ func GetAgentMetricsFromEndpoint(baseURL string) (*AgentMetrics, error) {
140147
if v.Type.String() == io_prometheus_client.MetricType_HISTOGRAM.String() {
141148
met := v.Metric[0]
142149
switch name := *v.Name; name {
143-
case "otelcol_http_client_duration":
150+
case "http_client_duration_milliseconds":
144151
agentMets.AvgServerResponseTime = float32(met.Histogram.GetSampleSum()) / float32(met.Histogram.GetSampleCount())
145-
case "otelcol_http_server_duration":
152+
case "http_server_duration_milliseconds":
146153
agentMets.AvgClientResponseTime = float32(met.Histogram.GetSampleSum()) / float32(met.Histogram.GetSampleCount())
147154
default:
148155
}
149156
} else {
150157
met := v.Metric[0]
151158
switch name := *v.Name; name {
152159
// Log-related metrics
153-
case "otelcol_receiver_accepted_log_records":
160+
case "otelcol_receiver_accepted_log_records_total":
154161
agentMets.LogsStats.ReceiverAcceptedCount = int(getMetricsSum(v.Metric))
155-
case "otelcol_receiver_refused_log_records":
162+
case "otelcol_receiver_refused_log_records_total":
156163
agentMets.LogsStats.ReceiverRefusedCount = int(getMetricsSum(v.Metric))
157-
case "otelcol_exporter_sent_log_records":
164+
case "otelcol_exporter_sent_log_records_total":
158165
agentMets.LogsStats.ExporterSentCount = int(getMetricsSum(v.Metric))
159-
case "otelcol_exporter_send_failed_log_records":
166+
case "otelcol_exporter_send_failed_log_records_total":
160167
agentMets.LogsStats.ExporterSendFailedCount = int(getMetricsSum(v.Metric))
161168

162169
// Metric-related metrics
163-
case "otelcol_receiver_accepted_metric_points":
170+
case "otelcol_receiver_accepted_metric_points_total":
164171
agentMets.MetricsStats.ReceiverAcceptedCount = int(getMetricsSum(v.Metric))
165-
case "otelcol_receiver_refused_metric_points":
172+
case "otelcol_receiver_refused_metric_points_total":
166173
agentMets.MetricsStats.ReceiverRefusedCount = int(getMetricsSum(v.Metric))
167-
case "otelcol_exporter_sent_metric_points":
174+
case "otelcol_exporter_sent_metric_points_total":
168175
agentMets.MetricsStats.ExporterSentCount = int(getMetricsSum(v.Metric))
169-
case "otelcol_exporter_send_failed_metric_points":
176+
case "otelcol_exporter_send_failed_metric_points_total":
170177
agentMets.MetricsStats.ExporterSendFailedCount = int(getMetricsSum(v.Metric))
171178

172179
// Trace-related metrics
173-
case "otelcol_receiver_accepted_spans":
180+
case "otelcol_receiver_accepted_spans_total":
174181
agentMets.TracesStats.ReceiverAcceptedCount = int(getMetricsSum(v.Metric))
175-
case "otelcol_receiver_refused_spans":
182+
case "otelcol_receiver_refused_spans_total":
176183
agentMets.TracesStats.ReceiverRefusedCount = int(getMetricsSum(v.Metric))
177-
case "otelcol_exporter_sent_spans":
184+
case "otelcol_exporter_sent_spans_total":
178185
agentMets.TracesStats.ExporterSentCount = int(getMetricsSum(v.Metric))
179-
case "otelcol_exporter_send_failed_spans":
186+
case "otelcol_exporter_send_failed_spans_total":
180187
agentMets.TracesStats.ExporterSendFailedCount = int(getMetricsSum(v.Metric))
181188

182189
// General metrics
183190
case "otelcol_exporter_queue_size":
184191
agentMets.ExporterQueueSize = float32(met.Gauge.GetValue())
185-
case "otelcol_process_cpu_seconds":
192+
case "otelcol_process_cpu_seconds_total":
186193
agentMets.CPUSeconds = float32(getMetricsSum(v.Metric))
187-
case "otelcol_process_uptime":
194+
case "otelcol_process_uptime_seconds_total":
188195
agentMets.Uptime = float32(getMetricsSum(v.Metric))
189-
case "otelcol_process_memory_rss":
196+
case "otelcol_process_memory_rss_bytes":
190197
agentMets.MemoryUsed = bToMb(float32(met.Gauge.GetValue()))
191198
case "otelcol_process_runtime_total_sys_memory_bytes":
192199
agentMets.TotalSysMemory = bToMb(float32(met.Gauge.GetValue()))
@@ -197,8 +204,8 @@ func GetAgentMetricsFromEndpoint(baseURL string) (*AgentMetrics, error) {
197204
return &agentMets, nil
198205
}
199206

200-
func GetStatusData(telemetryEndpoint string, healthcheckEndpoint string, healthcheckPath string) (*StatusData, error) {
201-
agentMets, err := GetAgentMetricsFromEndpoint(telemetryEndpoint)
207+
func GetStatusData(conf *config.AgentConfig) (*StatusData, error) {
208+
agentMets, err := GetAgentMetrics(conf)
202209
if err != nil {
203210
fmt.Fprintln(os.Stderr, "Error getting agent metrics: ", err)
204211
agentMets = &AgentMetrics{}
@@ -216,7 +223,7 @@ func GetStatusData(telemetryEndpoint string, healthcheckEndpoint string, healthc
216223
if err != nil {
217224
uptime = time.Duration(0)
218225
}
219-
status, err := GetAgentStatusFromHealthcheck(healthcheckEndpoint, healthcheckPath)
226+
status, err := GetAgentStatusFromHealthcheck(conf.HealthCheck.Endpoint, conf.HealthCheck.Path)
220227
if err != nil {
221228
fmt.Fprintln(os.Stderr, "Error receiving data from agent health check: ", err)
222229
status = NotRunning

0 commit comments

Comments
 (0)