{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DataKinds #-}
-----------------------------------------------------------------------------
-- |
-- Module      :  OpenTelemetry.Resource.Cloud
-- Copyright   :  (c) Ian Duncan, 2021
-- License     :  BSD-3
-- Description :  Cloud resource detection
-- Maintainer  :  Ian Duncan
-- Stability   :  experimental
-- Portability :  non-portable (GHC extensions)
--
-- Cloud resource detection
--
-----------------------------------------------------------------------------
module OpenTelemetry.Resource.Cloud 
  ( Cloud(..)
  ) where
import Data.Text (Text)
import OpenTelemetry.Resource (ToResource(..), mkResource, (.=?))

-- | A cloud infrastructure (e.g. GCP, Azure, AWS).
data Cloud = Cloud
  { Cloud -> Maybe Text
cloudProvider :: Maybe Text
  -- ^ Name of the cloud provider.
  --
  -- Examples: @alibaba_cloud@
  --
  -- cloud.provider MUST be one of the following or, if none of the listed values apply, a custom value:
  --
  -- +------------------+------------------------+
  -- | Value            | Description            |
  -- +==================+========================+
  -- | @alibaba_cloud@  | Alibaba Cloud          |
  -- +------------------+------------------------+
  -- | @aws@            | Amazon Web Services    |
  -- +------------------+------------------------+
  -- | @azure@          | Microsoft Azure        |
  -- +------------------+------------------------+
  -- | @gcp@            | Google Cloud Platform  |
  -- +------------------+------------------------+
  -- | @tencent_cloud@  | Tencent Cloud          |
  -- +------------------+------------------------+
  --
  , Cloud -> Maybe Text
cloudAccountId :: Maybe Text
  -- ^ The cloud account ID the resource is assigned to.
  , Cloud -> Maybe Text
cloudRegion :: Maybe Text
  -- ^ The geographical region the resource is running.
  , Cloud -> Maybe Text
cloudAvailabilityZone :: Maybe Text
  -- ^ Cloud regions often have multiple, isolated locations known as zones to increase availability. Availability zone represents the zone where the resource is running.
  , Cloud -> Maybe Text
cloudPlatform :: Maybe Text
  -- ^ The cloud platform in use.
  --
  -- Example: @alibaba_cloud_ecs@
  --
  -- MUST be one of the following or, if none of the listed values apply, a custom value:
  --
  -- +------------------------------+-------------------------------------------------+
  -- | Value                        | Description                                     |
  -- +==============================+=================================================+
  -- | @alibaba_cloud_ecs@          | Alibaba Cloud Elastic Compute Service           |
  -- +------------------------------+-------------------------------------------------+
  -- | @alibaba_cloud_fc@           | Alibaba Cloud Function Compute                  |
  -- +------------------------------+-------------------------------------------------+
  -- | @aws_ec2@                    | AWS Elastic Compute Cloud                       |
  -- +------------------------------+-------------------------------------------------+
  -- | @aws_ecs@                    | AWS Elastic Container Service                   |
  -- +------------------------------+-------------------------------------------------+
  -- | @aws_eks@                    | AWS Elastic Kubernetes Service                  |
  -- +------------------------------+-------------------------------------------------+
  -- | @aws_lambda@                 | AWS Lambda                                      |
  -- +------------------------------+-------------------------------------------------+
  -- | @aws_elastic_beanstalk@      | AWS Elastic Beanstalk                           |
  -- +------------------------------+-------------------------------------------------+
  -- | @aws_app_runner@             | AWS App Runner                                  |
  -- +------------------------------+-------------------------------------------------+
  -- | @azure_vm@                   | Azure Virtual Machines                          |
  -- +------------------------------+-------------------------------------------------+
  -- | @azure_container_instances@  | Azure Container Instances                       |
  -- +------------------------------+-------------------------------------------------+
  -- | @azure_aks@                  | Azure Kubernetes Service                        |
  -- +------------------------------+-------------------------------------------------+
  -- | @azure_functions@            | Azure Functions                                 |
  -- +------------------------------+-------------------------------------------------+
  -- | @azure_app_service@          | Azure App Service                               |
  -- +------------------------------+-------------------------------------------------+
  -- | @gcp_compute_engine@         | Google Cloud Compute Engine (GCE)               |
  -- +------------------------------+-------------------------------------------------+
  -- | @gcp_cloud_run@              | Google Cloud Run                                |
  -- +------------------------------+-------------------------------------------------+
  -- | @gcp_kubernetes_engine@      | Google Cloud Kubernetes Engine (GKE)            |
  -- +------------------------------+-------------------------------------------------+
  -- | @gcp_cloud_functions@        | Google Cloud Functions (GCF)                    |
  -- +------------------------------+-------------------------------------------------+
  -- | @gcp_app_engine@             | Google Cloud App Engine (GAE)                   |
  -- +------------------------------+-------------------------------------------------+
  -- | @tencent_cloud_cvm@          | Tencent Cloud Cloud Virtual Machine (CVM)       |
  -- +------------------------------+-------------------------------------------------+
  -- | @tencent_cloud_eks@          | Tencent Cloud Elastic Kubernetes Service (EKS)  |
  -- +------------------------------+-------------------------------------------------+
  -- | @tencent_cloud_scf@          | Tencent Cloud Serverless Cloud Function (SCF)   |
  -- +------------------------------+-------------------------------------------------+
  --
  }

instance ToResource Cloud where
  type ResourceSchema Cloud = 'Nothing
  toResource :: Cloud -> Resource (ResourceSchema Cloud)
toResource Cloud{Maybe Text
cloudPlatform :: Maybe Text
cloudAvailabilityZone :: Maybe Text
cloudRegion :: Maybe Text
cloudAccountId :: Maybe Text
cloudProvider :: Maybe Text
cloudPlatform :: Cloud -> Maybe Text
cloudAvailabilityZone :: Cloud -> Maybe Text
cloudRegion :: Cloud -> Maybe Text
cloudAccountId :: Cloud -> Maybe Text
cloudProvider :: Cloud -> Maybe Text
..} = [Maybe (Text, Attribute)] -> Resource 'Nothing
forall (r :: Maybe Symbol). [Maybe (Text, Attribute)] -> Resource r
mkResource
    [ Text
"cloud.provider" Text -> Maybe Text -> Maybe (Text, Attribute)
forall a.
ToAttribute a =>
Text -> Maybe a -> Maybe (Text, Attribute)
.=? Maybe Text
cloudProvider
    , Text
"cloud.account.id" Text -> Maybe Text -> Maybe (Text, Attribute)
forall a.
ToAttribute a =>
Text -> Maybe a -> Maybe (Text, Attribute)
.=? Maybe Text
cloudAccountId
    , Text
"cloud.region" Text -> Maybe Text -> Maybe (Text, Attribute)
forall a.
ToAttribute a =>
Text -> Maybe a -> Maybe (Text, Attribute)
.=? Maybe Text
cloudRegion
    , Text
"cloud.availability_zone" Text -> Maybe Text -> Maybe (Text, Attribute)
forall a.
ToAttribute a =>
Text -> Maybe a -> Maybe (Text, Attribute)
.=? Maybe Text
cloudAvailabilityZone
    , Text
"cloud.platform" Text -> Maybe Text -> Maybe (Text, Attribute)
forall a.
ToAttribute a =>
Text -> Maybe a -> Maybe (Text, Attribute)
.=? Maybe Text
cloudPlatform
    ]