{
  "repo": "tidbcloud/billing-reporter",
  "binary": "billing-reporter",
  "binary_path": "cmd/main.go",
  "dependencies": {
    "HTTP GET /metrics": {
      "infrastructure": {},
      "services": []
    },
    "HTTP GET /version": {
      "infrastructure": {},
      "services": []
    },
    "HTTP GET /scrape/status": {
      "infrastructure": {
        "kubernetes": {
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "LIST Pods",
              "trigger": "List all TiDB cluster pods",
              "conditions": ["Always"],
              "implementation": "sm.podLister.Pods(namespace).List(selector)"
            },
            {
              "operation": "GET Nodes",
              "trigger": "Get node info for pods",
              "conditions": ["Always"],
              "implementation": "sm.nodeLister.Get(nodeName)"
            },
            {
              "operation": "LIST TidbClusters",
              "trigger": "List all TiDBCluster CRDs",
              "conditions": ["Always"],
              "implementation": "sm.tcLister.List(labels.Everything())"
            },
            {
              "operation": "GET Jobs",
              "trigger": "Check cluster creating status via initializer job",
              "conditions": ["Always"],
              "implementation": "kubeCli.BatchV1().Jobs(namespace).Get(jobName, metav1.GetOptions{})"
            }
          ]
        },
        "pd": {
          "conditions": ["Always"],
          "operations": [
            {
              "operation": "GetStores",
              "trigger": "Get TiKV store info from PD",
              "conditions": ["Always"],
              "implementation": "pdClient.GetStores()"
            }
          ]
        },
        "sqs": {
          "conditions": ["Heartbeat data available"],
          "operations": [
            {
              "operation": "SendMessage",
              "trigger": "Send heartbeat message to SQS",
              "conditions": ["len(status.Heartbeat) > 0"],
              "implementation": "sm.sqsManager.SendSqsMessage(msg)"
            }
          ]
        }
      },
      "services": []
    }
  },
  "background_processes": [
    {
      "name": "ScrapeTidbClusterListInfo",
      "trigger": "Periodic (default 1 minute)",
      "implementation": "wait.Forever(scrapeTidbCluster, conf.ScrapeInterval)",
      "dependencies": {
        "infrastructure": {
          "kubernetes": {
            "conditions": ["Always"],
            "operations": [
              {
                "operation": "LIST TidbClusters",
                "trigger": "List all TiDBCluster CRDs",
                "conditions": ["Always"],
                "implementation": "sm.tcLister.List(labels.Everything())"
              },
              {
                "operation": "LIST Pods",
                "trigger": "List TiDB/TiKV/TiFlash pods",
                "conditions": ["Always"],
                "implementation": "sm.podLister.Pods(namespace).List(selector)"
              },
              {
                "operation": "GET Nodes",
                "trigger": "Get node info",
                "conditions": ["Always"],
                "implementation": "sm.nodeLister.Get(nodeName)"
              },
              {
                "operation": "GET Jobs",
                "trigger": "Check cluster creating status",
                "conditions": ["Always"],
                "implementation": "kubeCli.BatchV1().Jobs(namespace).Get(jobName, metav1.GetOptions{})"
              }
            ]
          },
          "pd": {
            "conditions": ["Always"],
            "operations": [
              {
                "operation": "GetStores",
                "trigger": "Get TiKV store info",
                "conditions": ["Always"],
                "implementation": "pdClient.GetStores()"
              }
            ]
          },
          "sqs": {
            "conditions": ["Data available"],
            "operations": [
              {
                "operation": "SendMessage",
                "trigger": "Send heartbeat to SQS",
                "conditions": ["len(infos) > 0"],
                "implementation": "sm.SendSqsMessage(msg)"
              },
              {
                "operation": "SendMessageBatch",
                "trigger": "Resend failed messages",
                "conditions": ["Failed messages file exists"],
                "implementation": "sm.sqsInstance.SendMessageBatch(bi)"
              }
            ]
          }
        },
        "services": []
      }
    },
    {
      "name": "ServiceLevelProber",
      "trigger": "Periodic (default 10 seconds)",
      "implementation": "wait.Forever(slp.ProbeStatus, conf.ServiceLevelProbeInterval)",
      "dependencies": {
        "infrastructure": {
          "kubernetes": {
            "conditions": ["Always"],
            "operations": [
              {
                "operation": "LIST TidbClusters",
                "trigger": "List clusters for probing",
                "conditions": ["Always"],
                "implementation": "slp.tcLister.List(labels.Everything())"
              },
              {
                "operation": "LIST Pods",
                "trigger": "List pods for health check",
                "conditions": ["Always"],
                "implementation": "slp.podLister.Pods(namespace).List(selector)"
              },
              {
                "operation": "GET Nodes",
                "trigger": "Get node info",
                "conditions": ["Always"],
                "implementation": "slp.nodeLister.Get(nodeName)"
              },
              {
                "operation": "GET Jobs",
                "trigger": "Check cluster creating status via initializer job",
                "conditions": ["Always"],
                "implementation": "kubeCli.BatchV1().Jobs(namespace).Get(jobName, metav1.GetOptions{})"
              }
            ]
          }
        },
        "services": []
      }
    }
  ]
}
