diff options
| author | Shulhan <ms@kilabit.info> | 2023-04-01 15:34:34 +0700 |
|---|---|---|
| committer | Shulhan <ms@kilabit.info> | 2023-07-27 00:40:14 +0700 |
| commit | a91993b95c88cf489e2503b6c8c03cbd7e67e207 (patch) | |
| tree | 7b7679cbaf3e5d7226ead6a9f1678a0c28dc69fc /cmd | |
| parent | 631dd476ac3fd7d7c8045b6e6ca59b63955bca67 (diff) | |
| download | rescached-dev-telemetry.tar.xz | |
[wip] cmd/rescached: add telemetry using questdbdev-telemetry
The telemetry collect the Go runtime/metrics and forward it to questdb
instance in localhost.
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/rescached/main.go | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/cmd/rescached/main.go b/cmd/rescached/main.go index e94be5e..1958974 100644 --- a/cmd/rescached/main.go +++ b/cmd/rescached/main.go @@ -13,8 +13,10 @@ import ( "flag" "fmt" "log" + "net/url" "os" "os/signal" + "regexp" "strings" "syscall" "time" @@ -22,6 +24,7 @@ import ( "git.sr.ht/~shulhan/ciigo" "github.com/shuLhan/share/lib/debug" "github.com/shuLhan/share/lib/memfs" + "github.com/shuLhan/share/lib/telemetry" "github.com/shuLhan/rescached-go/v4" ) @@ -85,6 +88,12 @@ func main() { go debugRuntime() } + var telemetryAgent *telemetry.Agent + telemetryAgent, err = createTelemetryAgent(env.Telemetry) + if err != nil { + log.Print(err) + } + qsignal = make(chan os.Signal, 1) signal.Notify(qsignal, syscall.SIGQUIT, syscall.SIGSEGV, syscall.SIGTERM, syscall.SIGINT) <-qsignal @@ -92,6 +101,9 @@ func main() { running <- false <-running } + if telemetryAgent != nil { + telemetryAgent.Stop() + } rcd.Stop() os.Exit(0) } @@ -111,6 +123,86 @@ func debugRuntime() { } } +func createTelemetryAgent(telemetryOpt string) (agent *telemetry.Agent, err error) { + if len(telemetryOpt) == 0 { + return nil, nil + } + + var ( + logp = `createTelemetryAgent` + ilpFmt = telemetry.NewIlpFormatter(`rescached`) + + forwarders []telemetry.Forwarder + telUrl *url.URL + ) + + telUrl, err = url.Parse(telemetryOpt) + if err != nil { + return nil, fmt.Errorf(`%s: %w`, logp, err) + } + + var schemes = strings.SplitN(telUrl.Scheme, `+`, 2) + + switch schemes[0] { + case `questdb`: + telUrl.Scheme = schemes[1] + + var ( + qdbOpts = telemetry.QuestdbOptions{ + Fmt: ilpFmt, + ServerUrl: telUrl.String(), + } + + qdbFwd *telemetry.QuestdbForwarder + ) + + qdbFwd, err = telemetry.NewQuestdbForwarder(qdbOpts) + if err != nil { + return nil, fmt.Errorf(`%s: %w`, logp, err) + } + + log.Printf(`Starting telemetry using questdb: %s`, qdbOpts.ServerUrl) + + forwarders = append(forwarders, qdbFwd) + + default: + return nil, fmt.Errorf(`%s: unknown forwarder %s`, logp, schemes[0]) + } + + // Create metadata. + var md = telemetry.NewMetadata() + md.Set(`version`, rescached.Version) + + var metricsCol telemetry.Collector + metricsCol, err = createMetricsCollector() + if err != nil { + return nil, fmt.Errorf(`%s: %w`, logp, err) + } + + // Create the Agent. + var agentOpts = telemetry.AgentOptions{ + Metadata: md, + Forwarders: forwarders, + Collectors: []telemetry.Collector{ + metricsCol, + }, + Interval: 10 * time.Second, + } + + agent = telemetry.NewAgent(agentOpts) + return agent, nil +} + +func createMetricsCollector() (col *telemetry.GoMetricsCollector, err error) { + var metricsFilter *regexp.Regexp + metricsFilter, err = regexp.Compile(`^go_(cpu|gc|memory|sched)_.*$`) + if err != nil { + return nil, err + } + col = telemetry.NewGoMetricsCollector(metricsFilter) + return col, nil +} + // watchWww watch any changes to files inside _www directory and regenerate // the embed file "memfs_generate.go". func watchWww(env *rescached.Environment, running chan bool) { |
