diff --git a/app/routers/metrics/increment.go b/app/routers/metrics/increment.go new file mode 100644 index 0000000..5e3502b --- /dev/null +++ b/app/routers/metrics/increment.go @@ -0,0 +1,25 @@ +package routers + +import ( + "encoding/json" + "log" + increments "monitoring/app/storage/clickhouse/tables" + "net/http" +) + +func AddIncrementMetric(r *http.Request) (interface{}, int) { + d := json.NewDecoder(r.Body) + body := increments.IncrementMetric{} + err := d.Decode(&body) + if err != nil { + return nil, http.StatusBadRequest + } + + err = increments.AddIncrementMetric(body) + if err != nil { + log.Print(err.Error()) + return nil, http.StatusInternalServerError + } + + return nil, http.StatusAccepted +} diff --git a/app/storage/clickhouse/client.go b/app/storage/clickhouse/client.go index 5c1e37a..f2f067e 100644 --- a/app/storage/clickhouse/client.go +++ b/app/storage/clickhouse/client.go @@ -91,5 +91,24 @@ func Migrate() error { log.Fatal(err) return err } + + err = Connection.Exec( + context.TODO(), + `CREATE TABLE IF NOT EXISTS increments ( + timestamp DateTime, + service LowCardinality(String), + environment LowCardinality(String), + name LowCardinality(String), + count UInt16 + ) + ENGINE = MergeTree + PARTITION BY toYYYYMM(timestamp) + ORDER BY (service, environment, name, timestamp);`, + ) + if err != nil { + log.Fatal(err) + return err + } + return nil } diff --git a/app/storage/clickhouse/tables/increments.go b/app/storage/clickhouse/tables/increments.go new file mode 100644 index 0000000..4f0123b --- /dev/null +++ b/app/storage/clickhouse/tables/increments.go @@ -0,0 +1,34 @@ +package storage + +import ( + "context" + "time" +) + +type IncrementMetric struct { + Timestamp time.Time `json:"timestamp"` + Service string `json:"service"` + Environment string `json:"environment"` + Name string `json:"name"` + Count int `json:"count"` +} + +func AddIncrementMetric(metric IncrementMetric) error { + batch, err := connection().PrepareBatch(context.Background(), "INSERT INTO increments") + if err != nil { + return err + } + + err = batch.Append( + metric.Timestamp, + metric.Service, + metric.Environment, + metric.Name, + metric.Count, + ) + if err != nil { + return err + } + + return batch.Send() +} diff --git a/main.go b/main.go index 20a8ed4..92c1fa9 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ import ( "encoding/json" "log" endpoint "monitoring/app/routers/metrics" + increment "monitoring/app/routers/metrics" task "monitoring/app/routers/metrics" client "monitoring/app/storage/clickhouse" "net/http" @@ -43,6 +44,7 @@ func main() { http.HandleFunc("/api/v1/metrics/endpoint", handlerWrapper(endpoint.AddEndpointMetric)) http.HandleFunc("/api/v1/metrics/task", handlerWrapper(task.AddTaskMetric)) + http.HandleFunc("/api/v1/metrics/increment", handlerWrapper(increment.AddIncrementMetric)) log.Printf("Server started") http.ListenAndServe(":1237", nil) }