hs-opentelemetry-sdk-1.0.0.0: src/OpenTelemetry/Resource/Detector/Heroku.hs
{-# LANGUAGE OverloadedStrings #-}
{- |
Module : OpenTelemetry.Resource.Detector.Heroku
Copyright : (c) Ian Duncan, 2024
License : BSD-3
Description : Detect Heroku dyno resource attributes from environment
Maintainer : Ian Duncan
Stability : experimental
Reads Heroku dyno metadata from environment variables to populate
resource attributes per the
<https://opentelemetry.io/docs/specs/semconv/resource/cloud-provider/heroku/ Heroku semantic conventions>.
Returns an empty 'Resource' if not running on Heroku (i.e.
@HEROKU_APP_ID@ is not set).
Populates: @cloud.provider@, @heroku.app.id@, @heroku.release.commit@,
@heroku.release.creation_timestamp@, @service.name@,
@service.version@, @service.instance.id@.
@since 0.1.0.2
-}
module OpenTelemetry.Resource.Detector.Heroku (
detectHeroku,
) where
import Data.Text (Text)
import OpenTelemetry.Attributes.Key (unkey)
import OpenTelemetry.Resource (Resource, mkResource, (.=), (.=?))
import OpenTelemetry.Resource.Detector.Internal (lookupEnvText)
import qualified OpenTelemetry.SemanticConventions as SC
{- | Detect Heroku dyno attributes from environment variables.
Returns an empty resource if @HEROKU_APP_ID@ is not set.
-}
detectHeroku :: IO Resource
detectHeroku = do
mAppId <- lookupEnvText "HEROKU_APP_ID"
case mAppId of
Nothing -> pure $ mkResource []
Just appId -> do
mAppName <- lookupEnvText "HEROKU_APP_NAME"
mDynoId <- lookupEnvText "HEROKU_DYNO_ID"
mReleaseVersion <- lookupEnvText "HEROKU_RELEASE_VERSION"
mSlugCommit <- lookupEnvText "HEROKU_SLUG_COMMIT"
mReleaseCreated <- lookupEnvText "HEROKU_RELEASE_CREATED_AT"
pure $
mkResource
[ unkey SC.cloud_provider .= ("heroku" :: Text)
, unkey SC.heroku_app_id .= appId
, unkey SC.heroku_release_commit .=? mSlugCommit
, unkey SC.heroku_release_creationTimestamp .=? mReleaseCreated
, unkey SC.service_name .=? mAppName
, unkey SC.service_version .=? mReleaseVersion
, unkey SC.service_instance_id .=? mDynoId
]