diff --git a/docs/graphql/manual/guides/telemetry.rst b/docs/graphql/manual/guides/telemetry.rst index b06807ac3ca2d..275f096bcfb91 100644 --- a/docs/graphql/manual/guides/telemetry.rst +++ b/docs/graphql/manual/guides/telemetry.rst @@ -33,7 +33,8 @@ Server The server periodically sends the number of tables, views, relationships, permission rules, custom SQL functions, event triggers and remote schemas tracked by GraphQL Engine, along with randomly generated UUID per database and -per instance. The server version is also sent. +per instance. The name of the current continuous integration environment +(if any) and the server version is also sent. Here is a sample row from the telemetry database: @@ -45,6 +46,7 @@ Here is a sample row from the telemetry database: "db_uid": "dddff371-dab2-450f-9969-235bca66dab1", "instance_uid": "6799360d-a431-40c5-9f68-24592a9f07df", "version": "v1.0.0-alpha36", + "ci": "TRAVIS", "metrics": { "views": 1, "tables": 2, diff --git a/server/graphql-engine.cabal b/server/graphql-engine.cabal index bee139a9abea8..7d89aa0725bec 100644 --- a/server/graphql-engine.cabal +++ b/server/graphql-engine.cabal @@ -141,6 +141,9 @@ library -- metrics in multiplexed subs , ekg-core + -- metrics for CI integration + , ci-info + -- serve static files , filepath >= 1.4 , mime-types >= 0.1 diff --git a/server/src-lib/Hasura/Server/CheckUpdates.hs b/server/src-lib/Hasura/Server/CheckUpdates.hs index de9f6a8993d1a..bcdcae5d3495f 100644 --- a/server/src-lib/Hasura/Server/CheckUpdates.hs +++ b/server/src-lib/Hasura/Server/CheckUpdates.hs @@ -5,8 +5,8 @@ module Hasura.Server.CheckUpdates import Control.Exception (try) import Control.Lens import Control.Monad (forever) -import System.Environment (lookupEnv) +import qualified CI import qualified Control.Concurrent as C import qualified Data.Aeson as A import qualified Data.Aeson.Casing as A @@ -47,14 +47,12 @@ checkForUpdates (LoggerCtx loggerSet _ _) manager = do where updateMsg v = "Update: A new version is available: " <> v getUrl = do - let buildUrl a = "https://releases.hasura.io/graphql-engine?agent=" - <> a - <> "&version=" - <> currentVersion - isCI <- lookupEnv "CI" - case isCI of - Just "true" -> return $ buildUrl "server-ci" - _ -> return $ buildUrl "server" + let buildUrl agent = "https://releases.hasura.io/graphql-engine?agent=" <> + agent <> "&version=" <> currentVersion + ciM <- CI.getCI + return . buildUrl $ case ciM of + Nothing -> "server" + Just ci -> "server-" <> (T.toLower . T.pack $ show ci) aDay = 86400 * 1000 * 1000 diff --git a/server/src-lib/Hasura/Server/Telemetry.hs b/server/src-lib/Hasura/Server/Telemetry.hs index e66040b488c95..1e57a57896b4b 100644 --- a/server/src-lib/Hasura/Server/Telemetry.hs +++ b/server/src-lib/Hasura/Server/Telemetry.hs @@ -22,6 +22,7 @@ import Hasura.Prelude import Hasura.RQL.Types import Hasura.Server.Version +import qualified CI import qualified Control.Concurrent as C import qualified Data.Aeson as A import qualified Data.Aeson.Casing as A @@ -72,6 +73,7 @@ data HasuraTelemetry { _htDbUid :: !Text , _htInstanceUid :: !Text , _htVersion :: !Text + , _htCi :: !(Maybe CI.CI) , _htMetrics :: !Metrics } deriving (Show, Eq) $(A.deriveJSON (A.aesonDrop 3 A.snakeCase) ''HasuraTelemetry) @@ -86,9 +88,11 @@ $(A.deriveJSON (A.aesonDrop 3 A.snakeCase) ''TelemetryPayload) telemetryUrl :: Text telemetryUrl = "https://telemetry.hasura.io/v1/http" -mkPayload :: Text -> Text -> Text -> Metrics -> TelemetryPayload -mkPayload dbId instanceId version metrics = - TelemetryPayload topic $ HasuraTelemetry dbId instanceId version metrics +mkPayload :: Text -> Text -> Text -> Metrics -> IO TelemetryPayload +mkPayload dbId instanceId version metrics = do + ci <- CI.getCI + return $ TelemetryPayload topic $ + HasuraTelemetry dbId instanceId version ci metrics where topic = bool "server" "server_test" isDevVersion runTelemetry @@ -102,7 +106,7 @@ runTelemetry (Logger logger) manager cacheRef (dbId, instanceId) = do forever $ do schemaCache <- fmap fst $ readIORef cacheRef let metrics = computeMetrics schemaCache - payload = A.encode $ mkPayload dbId instanceId currentVersion metrics + payload <- A.encode <$> mkPayload dbId instanceId currentVersion metrics logger $ debugLBS $ "metrics_info: " <> payload resp <- try $ Wreq.postWith options (T.unpack telemetryUrl) payload either logHttpEx handleHttpResp resp diff --git a/server/stack.yaml b/server/stack.yaml index 3993232ba99c8..f98d1b54b3e3f 100644 --- a/server/stack.yaml +++ b/server/stack.yaml @@ -16,6 +16,8 @@ extra-deps: commit: 85f9c2c15e4fa09f2e2a86dbb23149b5256bdd34 - git: https://github.com/hasura/graphql-parser-hs.git commit: 39d175c5c7bca35ec04d13c92a39f600bd6413cf +- git: https://github.com/hasura/ci-info-hs.git + commit: ad6df731584dc89b72a6e131687d37ef01714fe8 - ginger-0.8.4.0 # extra dep for pg-client-hs