glean-0.2.0.0: glean/db/Glean/Database/Logger.hs
{-
Copyright (c) Meta Platforms, Inc. and affiliates.
All rights reserved.
This source code is licensed under the BSD-style license found in the
LICENSE file in the root directory of this source tree.
-}
-- {-# OPTIONS_GHC -Wno-unused-do-bind #-}
module Glean.Database.Logger (
logDBStatistics
) where
import Data.Aeson (encode)
import Data.HashMap.Strict (HashMap)
import Data.Text (Text)
import Data.Text.Lazy (toStrict)
import Data.Text.Lazy.Encoding (decodeUtf8)
import qualified Glean.Database.Types as Database
import qualified Glean.Types as Thrift
import Glean.Logger.Database as Logger
import Glean.RTS.Foreign.Ownership (OwnershipStats(..))
import Glean.Types
import Glean.Util.Some
logDBStatistics
:: Database.Env -- ^ Environment
-> Thrift.Repo -- ^ Repo of interest
-> [(PredicateRef, Thrift.PredicateStats)]
-- ^ Digested stats per query in database
-> Maybe OwnershipStats
-> Int -- ^ Number of bytes backed up
-> Text -- ^ Backup locator
-> Bool -- ^ The db has exclude property
-> HashMap Text Text -- ^ Database properties
-> IO ()
logDBStatistics
env
Thrift.Repo{..}
preds
maybeOwnershipStats
size
locator
excluded
properties = do
let preamble = mconcat
[ Logger.SetRepoName repo_name
, Logger.SetRepoHash repo_hash
]
-- We shoehorn a summary row into the format for query rows
let propertiesJson = toStrict $ decodeUtf8 $ encode properties
summary = mconcat
[ Logger.SetPredicateSize size -- # bytes uploaded
, Logger.SetPredicateCount factCount -- # total facts
, Logger.SetUploadDestination locator
, Logger.SetHasExcludeProperty excluded
, Logger.SetDatabaseProperties propertiesJson
]
factCount = fromIntegral $ sum [predicateStats_count p| (_, p) <- preds]
let queries =
[ mconcat
[ Logger.SetPredicateName predicateRef_name
, Logger.SetPredicateVersion (fromIntegral predicateRef_version)
, Logger.SetPredicateCount $ fromIntegral predicateStats_count
, Logger.SetPredicateSize $ fromIntegral predicateStats_size
]
| (PredicateRef{..}, Thrift.PredicateStats{..}) <- preds
]
let ownership
| Just OwnershipStats{..} <- maybeOwnershipStats =
[
mconcat
[ Logger.SetMetric "ownership_units"
, Logger.SetCount $ fromIntegral numUnits
, Logger.SetSize $ fromIntegral unitsSize
],
mconcat
[ Logger.SetMetric "ownership_sets"
, Logger.SetCount $ fromIntegral numSets
, Logger.SetSize $ fromIntegral setsSize
],
mconcat
[ Logger.SetMetric "ownership_fact_owners"
, Logger.SetCount $ fromIntegral numOwnerEntries
, Logger.SetSize $ fromIntegral ownersSize
],
mconcat
[ Logger.SetMetric "ownership_orphan_facts"
, Logger.SetCount $ fromIntegral numOrphanFacts
]
]
| otherwise = []
let logStats log = case Database.envDatabaseLogger env of
Some logger -> Logger.runLog logger $ preamble <> log
-- We want a new row in the log table for the summary, and a new row
-- for each query
mapM_ logStats (summary:queries <> ownership)