packages feed

glean-0.1.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.Text (Text)

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
  -> IO ()
logDBStatistics
  env
  Thrift.Repo{..}
  preds
  maybeOwnershipStats
  size
  locator
  excluded = do
  let preamble = mconcat
        [ Logger.SetRepoName repo_name
        , Logger.SetRepoHash repo_hash
        ]

  -- We shoehorn a summary row into the format for query rows
  let summary  = mconcat
        [ Logger.SetPredicateSize size            -- # bytes uploaded
        , Logger.SetPredicateCount factCount      -- # total facts
        , Logger.SetUploadDestination locator
        , Logger.SetHasExcludeProperty excluded
        ]
      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)