{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeFamilies #-}

-----------------------------------------------------------------------------

-----------------------------------------------------------------------------

{- |
 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
..} =
    forall (r :: Maybe Symbol). [Maybe (Text, Attribute)] -> Resource r
mkResource
      [ Text
"cloud.provider" forall a.
ToAttribute a =>
Text -> Maybe a -> Maybe (Text, Attribute)
.=? Maybe Text
cloudProvider
      , Text
"cloud.account.id" forall a.
ToAttribute a =>
Text -> Maybe a -> Maybe (Text, Attribute)
.=? Maybe Text
cloudAccountId
      , Text
"cloud.region" forall a.
ToAttribute a =>
Text -> Maybe a -> Maybe (Text, Attribute)
.=? Maybe Text
cloudRegion
      , Text
"cloud.availability_zone" forall a.
ToAttribute a =>
Text -> Maybe a -> Maybe (Text, Attribute)
.=? Maybe Text
cloudAvailabilityZone
      , Text
"cloud.platform" forall a.
ToAttribute a =>
Text -> Maybe a -> Maybe (Text, Attribute)
.=? Maybe Text
cloudPlatform
      ]