{- |
 Module      :  OpenTelemetry.Resource.Service
 Copyright   :  (c) Ian Duncan, 2021
 License     :  BSD-3
 Description :  Resource information about a "service"
 Maintainer  :  Ian Duncan
 Stability   :  experimental
 Portability :  non-portable (GHC extensions)
-}
module OpenTelemetry.Resource.Service where

import Data.Text (Text)
import OpenTelemetry.Attributes.Key (unkey)
import OpenTelemetry.Resource
import qualified OpenTelemetry.SemanticConventions as SC


{- | A service instance

@since 0.0.1.0
-}
data Service = Service
  { Service -> Text
serviceName :: Text
  {- ^ Logical name of the service.

  MUST be the same for all instances of horizontally scaled services.
  If the value was not specified, SDKs MUST fallback to unknown_service: concatenated with process.executable.name,
  e.g. unknown_service:bash. If process.executable.name is not available, the value MUST be set to unknown_service.

  If using the built-in resource detectors, this can be specified via the
  @OTEL_SERVICE_NAME@ environment variable

  Example: @shoppingcart@
  -}
  , Service -> Maybe Text
serviceNamespace :: Maybe Text
  {- ^ A namespace for service.name.

  A string value having a meaning that helps to distinguish a group of services, for example the team name that owns a group of services. service.name is expected to be unique within the same namespace. If service.namespace is not specified in the Resource then service.name is expected to be unique for all services that have no explicit namespace defined (so the empty/unspecified namespace is simply one more valid namespace). Zero-length namespace string is assumed equal to unspecified namespace.

  Example: @Shop@
  -}
  , Service -> Maybe Text
serviceInstanceId :: Maybe Text
  {- ^ The string ID of the service instance.

  Example: @627cc493-f310-47de-96bd-71410b7dec09@
  -}
  , Service -> Maybe Text
serviceVersion :: Maybe Text
  {- ^ The version string of the service API or implementation.

  Example: @2.0.0@
  -}
  , Service -> Maybe Text
serviceCriticality :: Maybe Text
  -- ^ Criticality of the service relative to other services.
  }


instance ToResource Service where
  toResource :: Service -> Resource
toResource Service {Maybe Text
Text
serviceName :: Service -> Text
serviceNamespace :: Service -> Maybe Text
serviceInstanceId :: Service -> Maybe Text
serviceVersion :: Service -> Maybe Text
serviceCriticality :: Service -> Maybe Text
serviceName :: Text
serviceNamespace :: Maybe Text
serviceInstanceId :: Maybe Text
serviceVersion :: Maybe Text
serviceCriticality :: Maybe Text
..} =
    Maybe Text -> [Maybe (Text, Attribute)] -> Resource
mkResourceWithSchema
      (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
semConvSchemaUrl)
      [ AttributeKey Text -> Text
forall a. AttributeKey a -> Text
unkey AttributeKey Text
SC.service_name Text -> Text -> Maybe (Text, Attribute)
forall a. ToAttribute a => Text -> a -> Maybe (Text, Attribute)
.= Text
serviceName
      , AttributeKey Text -> Text
forall a. AttributeKey a -> Text
unkey AttributeKey Text
SC.service_namespace Text -> Maybe Text -> Maybe (Text, Attribute)
forall a.
ToAttribute a =>
Text -> Maybe a -> Maybe (Text, Attribute)
.=? Maybe Text
serviceNamespace
      , AttributeKey Text -> Text
forall a. AttributeKey a -> Text
unkey AttributeKey Text
SC.service_instance_id Text -> Maybe Text -> Maybe (Text, Attribute)
forall a.
ToAttribute a =>
Text -> Maybe a -> Maybe (Text, Attribute)
.=? Maybe Text
serviceInstanceId
      , AttributeKey Text -> Text
forall a. AttributeKey a -> Text
unkey AttributeKey Text
SC.service_version Text -> Maybe Text -> Maybe (Text, Attribute)
forall a.
ToAttribute a =>
Text -> Maybe a -> Maybe (Text, Attribute)
.=? Maybe Text
serviceVersion
      , AttributeKey Text -> Text
forall a. AttributeKey a -> Text
unkey AttributeKey Text
SC.service_criticality Text -> Maybe Text -> Maybe (Text, Attribute)
forall a.
ToAttribute a =>
Text -> Maybe a -> Maybe (Text, Attribute)
.=? Maybe Text
serviceCriticality
      ]