From 523987f6d8363703afc6a222eb759ada09b2b3aa Mon Sep 17 00:00:00 2001 From: Nikolay Sivko Date: Mon, 1 Sep 2025 11:35:02 +0300 Subject: [PATCH 1/2] FoundationDB support --- constructor/containers.go | 3 +++ constructor/queries.go | 3 +++ model/connection.go | 25 +++++++++++++------------ 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/constructor/containers.go b/constructor/containers.go index ce18c7c97..67ff83a53 100644 --- a/constructor/containers.go +++ b/constructor/containers.go @@ -370,6 +370,7 @@ func (c *Constructor) loadContainers(w *model.World, metrics map[string][]*model loadL7RequestsCount("container_nats_messages", model.ProtocolNats) loadL7RequestsCount("container_clickhouse_queries_count", model.ProtocolClickhouse) loadL7RequestsCount("container_zookeeper_requests_count", model.ProtocolZookeeper) + loadL7RequestsCount("container_foundationdb_requests_count", model.ProtocolFoundationdb) loadL7RequestsLatency := func(queryName string, protocol model.Protocol) { loadConnection(queryName, func(instance *model.Instance, connection *model.Connection, metric *model.MetricValues) { @@ -386,6 +387,7 @@ func (c *Constructor) loadContainers(w *model.World, metrics map[string][]*model loadL7RequestsLatency("container_cassandra_queries_latency_total", model.ProtocolCassandra) loadL7RequestsLatency("container_clickhouse_queries_latency_total", model.ProtocolClickhouse) loadL7RequestsLatency("container_zookeeper_requests_latency_total", model.ProtocolZookeeper) + loadL7RequestsLatency("container_foundationdb_requests_latency_total", model.ProtocolFoundationdb) loadL7RequestsHistogram := func(queryName string, protocol model.Protocol) { loadConnection(queryName, func(instance *model.Instance, connection *model.Connection, metric *model.MetricValues) { @@ -410,6 +412,7 @@ func (c *Constructor) loadContainers(w *model.World, metrics map[string][]*model loadL7RequestsHistogram("container_cassandra_queries_histogram", model.ProtocolCassandra) loadL7RequestsHistogram("container_clickhouse_queries_histogram", model.ProtocolClickhouse) loadL7RequestsHistogram("container_zookeeper_requests_histogram", model.ProtocolZookeeper) + loadL7RequestsHistogram("container_foundationdb_requests_histogram", model.ProtocolFoundationdb) loadInstanceByDest := func(queryName string, f func(instance *model.Instance, m *model.MetricValues)) { ms := metrics[queryName] diff --git a/constructor/queries.go b/constructor/queries.go index 9066e791b..36852be94 100644 --- a/constructor/queries.go +++ b/constructor/queries.go @@ -266,6 +266,9 @@ var QUERIES = []Query{ qItoI("container_zookeeper_requests_count", l7Req("container_zookeeper_requests_total"), "status"), qItoI("container_zookeeper_requests_latency_total", l7Latency("container_zookeeper_requests_duration_seconds_total_sum")), qItoI("container_zookeeper_requests_histogram", l7Histogram("container_zookeeper_requests_duration_seconds_total_bucket"), "le"), + qItoI("container_foundationdb_requests_count", l7Req("container_foundationdb_requests_total"), "status"), + qItoI("container_foundationdb_requests_latency_total", l7Latency("container_foundationdb_requests_duration_seconds_total_sum")), + qItoI("container_foundationdb_requests_histogram", l7Histogram("container_foundationdb_requests_duration_seconds_total_bucket"), "le"), qItoI("container_rabbitmq_messages", l7ReqWithMethod("container_rabbitmq_messages_total"), "status", "method"), qItoI("container_nats_messages", l7ReqWithMethod("container_nats_messages_total"), "status", "method"), diff --git a/model/connection.go b/model/connection.go index 5537e5f91..ec49667cb 100644 --- a/model/connection.go +++ b/model/connection.go @@ -9,18 +9,19 @@ import ( type Protocol string const ( - ProtocolHttp Protocol = "http" - ProtocolPostgres Protocol = "postgres" - ProtocolMongodb Protocol = "mongo" - ProtocolRedis Protocol = "redis" - ProtocolMysql Protocol = "mysql" - ProtocolMemcached Protocol = "memcached" - ProtocolKafka Protocol = "kafka" - ProtocolCassandra Protocol = "cassandra" - ProtocolRabbitmq Protocol = "rabbitmq" - ProtocolNats Protocol = "nats" - ProtocolClickhouse Protocol = "clickhouse" - ProtocolZookeeper Protocol = "zookeeper" + ProtocolHttp Protocol = "http" + ProtocolPostgres Protocol = "postgres" + ProtocolMongodb Protocol = "mongo" + ProtocolRedis Protocol = "redis" + ProtocolMysql Protocol = "mysql" + ProtocolMemcached Protocol = "memcached" + ProtocolKafka Protocol = "kafka" + ProtocolCassandra Protocol = "cassandra" + ProtocolRabbitmq Protocol = "rabbitmq" + ProtocolNats Protocol = "nats" + ProtocolClickhouse Protocol = "clickhouse" + ProtocolZookeeper Protocol = "zookeeper" + ProtocolFoundationdb Protocol = "foundationdb" ) func (p Protocol) ToApplicationType() ApplicationType { From d7886ae2711db21e7c8a4decbd791e0ae238d9e6 Mon Sep 17 00:00:00 2001 From: Anton Petruhin Date: Mon, 1 Sep 2025 12:53:03 +0400 Subject: [PATCH 2/2] ui: LicenseCheck UI component --- api/api.go | 4 +- api/ctx.go | 21 ++++++- front/src/App.vue | 30 ++++++++- front/src/api.js | 2 + front/src/components/CheckForUpdates.vue | 45 +++++++------- front/src/components/LicenseCheck.vue | 77 ++++++++++++++++++++++++ main.go | 2 +- 7 files changed, 154 insertions(+), 27 deletions(-) create mode 100644 front/src/components/LicenseCheck.vue diff --git a/api/api.go b/api/api.go index b33a45828..d7207d86c 100644 --- a/api/api.go +++ b/api/api.go @@ -39,6 +39,7 @@ type Api struct { roles rbac.RoleManager globalClickHouse *db.IntegrationClickhouse globalPrometheus *db.IntegrationPrometheus + licenseMgr LicenseManager authSecret string authAnonymousRole rbac.RoleName @@ -47,7 +48,7 @@ type Api struct { instanceUuid string } -func NewApi(cache *cache.Cache, db *db.DB, collector *collector.Collector, pricing *pricing.Manager, roles rbac.RoleManager, +func NewApi(cache *cache.Cache, db *db.DB, collector *collector.Collector, pricing *pricing.Manager, roles rbac.RoleManager, licenseMgr LicenseManager, globalClickHouse *db.IntegrationClickhouse, globalPrometheus *db.IntegrationPrometheus, deploymentUuid, instanceUuid string) *Api { return &Api{ @@ -58,6 +59,7 @@ func NewApi(cache *cache.Cache, db *db.DB, collector *collector.Collector, prici roles: roles, globalClickHouse: globalClickHouse, globalPrometheus: globalPrometheus, + licenseMgr: licenseMgr, deploymentUuid: deploymentUuid, instanceUuid: instanceUuid, } diff --git a/api/ctx.go b/api/ctx.go index c722f249d..3e26dca2b 100644 --- a/api/ctx.go +++ b/api/ctx.go @@ -18,6 +18,7 @@ type Context struct { Status Status `json:"status"` Search Search `json:"search"` Incidents map[model.ApplicationCategory]int `json:"incidents"` + License *License `json:"license,omitempty"` } type Status struct { @@ -60,8 +61,17 @@ type Node struct { Status model.Status `json:"status"` } +type License struct { + Invalid bool `json:"invalid"` + Message string `json:"message"` +} + +type LicenseManager interface { + CheckLicense() *License +} + func (api *Api) WithContext(p *db.Project, cacheStatus *cache.Status, w *model.World, data any) DataWithContext { - return DataWithContext{ + res := DataWithContext{ Context: Context{ Status: renderStatus(p, cacheStatus, w, api.globalPrometheus), Search: renderSearch(w), @@ -69,6 +79,15 @@ func (api *Api) WithContext(p *db.Project, cacheStatus *cache.Status, w *model.W }, Data: data, } + if lm := api.licenseMgr; lm != nil { + if l := lm.CheckLicense(); l != nil { + res.Context.License = l + if l.Invalid { + res.Data = nil + } + } + } + return res } func renderIncidents(w *model.World) map[model.ApplicationCategory]int { diff --git a/front/src/App.vue b/front/src/App.vue index 8ac061ff7..b22c3e5ae 100644 --- a/front/src/App.vue +++ b/front/src/App.vue @@ -1,6 +1,14 @@