aboutsummaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'cmd')
-rw-r--r--cmd/rescached/main.go92
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) {