{
	"info": {
		"_postman_id": "4193e69f-5230-412d-9f80-f89a7bce9d9a",
		"name": "ConProf API Tests",
		"description": "API tests for Continuous Profiling service. Use with Newman for automated testing.",
		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
		"_exporter_id": "46566272"
	},
	"variable": [
		{
			"key": "base_url",
			"value": "http://localhost:8081/api/v1",
			"type": "string"
		},
		{
			"key": "provider",
			"value": "aws",
			"type": "string"
		},
		{
			"key": "region",
			"value": "us-west-2",
			"type": "string"
		},
		{
			"key": "org_id",
			"value": "shared_pool",
			"type": "string"
		},
		{
			"key": "project_id",
			"value": "",
			"type": "string"
		},
		{
			"key": "cluster_id",
			"value": "test",
			"type": "string"
		},
		{
			"key": "deploy_type",
			"value": "premium",
			"type": "string"
		},
		{
			"key": "action_token",
			"value": "",
			"type": "string"
		}
	],
	"item": [
		{
			"name": "1. List Profiles",
			"item": [
				{
					"name": "Success - Premium Deploy",
					"event": [
						{
							"listen": "prerequest",
							"script": {
								"exec": [
									"// Calculate timestamps",
									"const now = Math.floor(Date.now() / 1000);",
									"const oneHourAgo = now - 3600;",
									"pm.environment.set('current_timestamp', now.toString());",
									"pm.environment.set('one_hour_ago', oneHourAgo.toString());"
								],
								"type": "text/javascript"
							}
						},
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status code is 200\", function () {",
									"    pm.response.to.have.status(200);",
									"});",
									"",
									"pm.test(\"Response is JSON array\", function () {",
									"    pm.response.to.be.json;",
									"    const jsonData = pm.response.json();",
									"    pm.expect(jsonData).to.be.an('array');",
									"});",
									"",
									"pm.test(\"Response items have required fields\", function () {",
									"    const jsonData = pm.response.json();",
									"    if (jsonData.length > 0) {",
									"        pm.expect(jsonData[0]).to.have.property('ts');",
									"        pm.expect(jsonData[0]).to.have.property('profile_duration_secs');",
									"        pm.expect(jsonData[0]).to.have.property('state');",
									"        pm.expect(jsonData[0]).to.have.property('component_num');",
									"    }",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "x-provider",
								"value": "{{provider}}"
							},
							{
								"key": "x-region",
								"value": "{{region}}"
							},
							{
								"key": "x-org-id",
								"value": "{{org_id}}"
							},
							{
								"key": "x-cluster-id",
								"value": "{{cluster_id}}"
							},
							{
								"key": "x-deploy-type",
								"value": "{{deploy_type}}"
							}
						],
						"url": {
							"raw": "{{base_url}}/continuous_profiling/group_profiles?begin_time={{one_hour_ago}}&end_time={{current_timestamp}}",
							"host": ["{{base_url}}"],
							"path": ["continuous_profiling", "group_profiles"],
							"query": [
								{
									"key": "begin_time",
									"value": "{{one_hour_ago}}",
									"description": "1 hour ago"
								},
								{
									"key": "end_time",
									"value": "{{current_timestamp}}",
									"description": "current time"
								}
							]
						},
						"description": "List profiles for premium deployment type"
					}
				},
				{
					"name": "Success - Dedicated Deploy",
					"event": [
						{
							"listen": "prerequest",
							"script": {
								"exec": [
									"const now = Math.floor(Date.now() / 1000);",
									"const oneHourAgo = now - 3600;",
									"pm.environment.set('current_timestamp', now.toString());",
									"pm.environment.set('one_hour_ago', oneHourAgo.toString());"
								],
								"type": "text/javascript"
							}
						},
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status code is 200\", function () {",
									"    pm.response.to.have.status(200);",
									"});",
									"",
									"pm.test(\"Response is JSON array\", function () {",
									"    pm.response.to.be.json;",
									"    const jsonData = pm.response.json();",
									"    pm.expect(jsonData).to.be.an('array');",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "x-provider",
								"value": "{{provider}}"
							},
							{
								"key": "x-region",
								"value": "{{region}}"
							},
							{
								"key": "x-org-id",
								"value": "1372813089208851780"
							},
							{
								"key": "x-project-id",
								"value": "1372813089396081284"
							},
							{
								"key": "x-cluster-id",
								"value": "1379661944646413760"
							},
							{
								"key": "x-deploy-type",
								"value": "dedicated"
							}
						],
						"url": {
							"raw": "{{base_url}}/continuous_profiling/group_profiles?begin_time={{one_hour_ago}}&end_time={{current_timestamp}}",
							"host": ["{{base_url}}"],
							"path": ["continuous_profiling", "group_profiles"],
							"query": [
								{
									"key": "begin_time",
									"value": "{{one_hour_ago}}"
								},
								{
									"key": "end_time",
									"value": "{{current_timestamp}}"
								}
							]
						},
						"description": "List profiles for dedicated deployment type"
					}
				},
				{
					"name": "Error - Missing Required Header",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status code is 400\", function () {",
									"    pm.response.to.have.status(400);",
									"});",
									"",
									"pm.test(\"Error response structure\", function () {",
									"    const jsonData = pm.response.json();",
									"    pm.expect(jsonData).to.have.property('error', true);",
									"    pm.expect(jsonData).to.have.property('message');",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "x-provider",
								"value": "{{provider}}"
							}
						],
						"url": {
							"raw": "{{base_url}}/continuous_profiling/group_profiles?begin_time={{one_hour_ago}}&end_time={{current_timestamp}}",
							"host": ["{{base_url}}"],
							"path": ["continuous_profiling", "group_profiles"],
							"query": [
								{
									"key": "begin_time",
									"value": "{{one_hour_ago}}"
								},
								{
									"key": "end_time",
									"value": "{{current_timestamp}}"
								}
							]
						},
						"description": "Test error handling when required headers are missing"
					}
				},
				{
					"name": "Error - Missing Query Parameters",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status code is 400\", function () {",
									"    pm.response.to.have.status(400);",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "x-provider",
								"value": "{{provider}}"
							},
							{
								"key": "x-region",
								"value": "{{region}}"
							},
							{
								"key": "x-cluster-id",
								"value": "{{cluster_id}}"
							}
						],
						"url": {
							"raw": "{{base_url}}/continuous_profiling/group_profiles",
							"host": ["{{base_url}}"],
							"path": ["continuous_profiling", "group_profiles"]
						},
						"description": "Test error handling when query parameters are missing"
					}
				}
			],
			"description": "Tests for listing group profiles"
		},
		{
			"name": "2. Profile Detail",
			"item": [
				{
					"name": "Success",
					"event": [
						{
							"listen": "prerequest",
							"script": {
								"exec": [
									"const now = Math.floor(Date.now() / 1000);",
									"const fiveMinutesAgo = now - 300;",
									"pm.environment.set('five_minutes_ago', fiveMinutesAgo.toString());"
								],
								"type": "text/javascript"
							}
						},
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status code is 200\", function () {",
									"    pm.response.to.have.status(200);",
									"});",
									"",
									"pm.test(\"Response has required fields\", function () {",
									"    const jsonData = pm.response.json();",
									"    if (jsonData !== null && jsonData !== undefined) {",
									"        pm.expect(jsonData).to.have.property('ts');",
									"        pm.expect(jsonData).to.have.property('profile_duration_secs');",
									"        pm.expect(jsonData).to.have.property('state');",
									"        pm.expect(jsonData).to.have.property('target_profiles');",
									"        pm.expect(jsonData.target_profiles).to.be.an('array');",
									"    } else {",
									"        // Empty response is valid when no profiles found",
									"        pm.expect(jsonData).to.be.null;",
									"    }",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "x-provider",
								"value": "{{provider}}"
							},
							{
								"key": "x-region",
								"value": "{{region}}"
							},
							{
								"key": "x-org-id",
								"value": "{{org_id}}"
							},
							{
								"key": "x-cluster-id",
								"value": "{{cluster_id}}"
							},
							{
								"key": "x-deploy-type",
								"value": "{{deploy_type}}"
							}
						],
						"url": {
							"raw": "{{base_url}}/continuous_profiling/group_profile/detail?ts={{five_minutes_ago}}",
							"host": ["{{base_url}}"],
							"path": ["continuous_profiling", "group_profile", "detail"],
							"query": [
								{
									"key": "ts",
									"value": "{{five_minutes_ago}}",
									"description": "5 minutes ago"
								}
							]
						},
						"description": "Get detail of a specific profile group"
					}
				},
				{
					"name": "Error - Missing Timestamp",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status code is 400\", function () {",
									"    pm.response.to.have.status(400);",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "x-provider",
								"value": "{{provider}}"
							},
							{
								"key": "x-region",
								"value": "{{region}}"
							},
							{
								"key": "x-cluster-id",
								"value": "{{cluster_id}}"
							}
						],
						"url": {
							"raw": "{{base_url}}/continuous_profiling/group_profile/detail",
							"host": ["{{base_url}}"],
							"path": ["continuous_profiling", "group_profile", "detail"]
						},
						"description": "Test error when timestamp parameter is missing"
					}
				}
			],
			"description": "Tests for getting profile detail"
		},
		{
			"name": "3. Action Token",
			"item": [
				{
					"name": "Success - Generate Token",
					"event": [
						{
							"listen": "prerequest",
							"script": {
								"exec": [
									"// Generate query string for profile download",
									"const ts = Math.floor(Date.now() / 1000) - 300;",
									"const queryString = `ts=${ts}&profile_type=cpu&component=tidb&address=127.0.0.1:10080`;",
									"pm.environment.set('profile_query', queryString);"
								],
								"type": "text/javascript"
							}
						},
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status code is 200\", function () {",
									"    pm.response.to.have.status(200);",
									"});",
									"",
									"pm.test(\"Response is a token string\", function () {",
									"    const token = pm.response.text();",
									"    pm.expect(token).to.be.a('string');",
									"    pm.expect(token.length).to.be.greaterThan(0);",
									"});",
									"",
									"pm.test(\"Save token for later use\", function () {",
									"    const token = pm.response.text();",
									"    pm.environment.set('action_token', token);",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "x-provider",
								"value": "{{provider}}"
							},
							{
								"key": "x-region",
								"value": "{{region}}"
							},
							{
								"key": "x-org-id",
								"value": "{{org_id}}"
							},
							{
								"key": "x-cluster-id",
								"value": "{{cluster_id}}"
							},
							{
								"key": "x-deploy-type",
								"value": "{{deploy_type}}"
							}
						],
						"url": {
							"raw": "{{base_url}}/continuous_profiling/action_token?q={{profile_query}}",
							"host": ["{{base_url}}"],
							"path": ["continuous_profiling", "action_token"],
							"query": [
								{
									"key": "q",
									"value": "{{profile_query}}",
									"description": "Query string: ts=timestamp&profile_type=cpu&component=tidb&address=127.0.0.1:10080"
								}
							]
						},
						"description": "Generate action token for downloading/viewing profile"
					}
				},
				{
					"name": "Success - Generate Token for TiKV Heap",
					"event": [
						{
							"listen": "prerequest",
							"script": {
								"exec": [
									"const ts = Math.floor(Date.now() / 1000) - 300;",
									"const queryString = `ts=${ts}&profile_type=heap&component=tikv&address=127.0.0.1:20160`;",
									"pm.environment.set('tikv_heap_query', queryString);"
								],
								"type": "text/javascript"
							}
						},
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status code is 200\", function () {",
									"    pm.response.to.have.status(200);",
									"});",
									"",
									"pm.test(\"Save token\", function () {",
									"    const token = pm.response.text();",
									"    pm.environment.set('tikv_heap_token', token);",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "x-provider",
								"value": "{{provider}}"
							},
							{
								"key": "x-region",
								"value": "{{region}}"
							},
							{
								"key": "x-org-id",
								"value": "{{org_id}}"
							},
							{
								"key": "x-cluster-id",
								"value": "{{cluster_id}}"
							},
							{
								"key": "x-deploy-type",
								"value": "{{deploy_type}}"
							}
						],
						"url": {
							"raw": "{{base_url}}/continuous_profiling/action_token?q={{tikv_heap_query}}",
							"host": ["{{base_url}}"],
							"path": ["continuous_profiling", "action_token"],
							"query": [
								{
									"key": "q",
									"value": "{{tikv_heap_query}}"
								}
							]
						},
						"description": "Generate token for TiKV heap profile (requires special processing)"
					}
				},
				{
					"name": "Error - Missing Required Header",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status code is 400\", function () {",
									"    pm.response.to.have.status(400);",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/continuous_profiling/action_token?q=ts=1234567890&profile_type=cpu&component=tidb&address=127.0.0.1:10080",
							"host": ["{{base_url}}"],
							"path": ["continuous_profiling", "action_token"],
							"query": [
								{
									"key": "q",
									"value": "ts=1234567890&profile_type=cpu&component=tidb&address=127.0.0.1:10080"
								}
							]
						},
						"description": "Test error when required headers are missing"
					}
				}
			],
			"description": "Tests for generating action tokens"
		},
		{
			"name": "4. Download Profile",
			"item": [
				{
					"name": "Success - Download as ZIP",
					"event": [
						{
							"listen": "prerequest",
							"script": {
								"exec": [
									"// Use token from action_token request",
									"if (!pm.environment.get('action_token')) {",
									"    pm.environment.set('action_token', '{{action_token}}');",
									"}",
									"// Calculate timestamp",
									"const now = Math.floor(Date.now() / 1000);",
									"const fiveMinutesAgo = now - 300;",
									"pm.environment.set('five_minutes_ago', fiveMinutesAgo.toString());"
								],
								"type": "text/javascript"
							}
						},
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status code is 200 or 400 (no data)\", function () {",
									"    pm.expect(pm.response.code).to.be.oneOf([200, 400]);",
									"});",
									"",
									"pm.test(\"Content-Type is application/zip or error\", function () {",
									"    if (pm.response.code === 200) {",
									"        pm.expect(pm.response.headers.get('Content-Type')).to.include('application/zip');",
									"    } else {",
									"        // 400 means no profile data found",
									"        pm.expect(pm.response.code).to.equal(400);",
									"    }",
									"});",
									"",
									"pm.test(\"Content-Disposition header present\", function () {",
									"    const contentDisposition = pm.response.headers.get('Content-Disposition');",
									"    if (contentDisposition) {",
									"        pm.expect(contentDisposition).to.include('attachment');",
									"    } else {",
									"        // If download fails (no data), skip this check",
									"        pm.expect(pm.response.code).to.be.oneOf([200, 400]);",
									"    }",
									"});",
									"",
									"pm.test(\"Response body is not empty or error\", function () {",
									"    if (pm.response.code === 200) {",
									"        pm.expect(pm.response.body).to.not.be.empty;",
									"    } else {",
									"        // 400 means no profile data found, which is acceptable",
									"        pm.expect(pm.response.code).to.equal(400);",
									"    }",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/continuous_profiling/download?token={{action_token}}",
							"host": ["{{base_url}}"],
							"path": ["continuous_profiling", "download"],
							"query": [
								{
									"key": "token",
									"value": "{{action_token}}",
									"description": "Token contains all query params in Q field"
								}
							]
						},
						"description": "Download profile as ZIP file. Note: query params (ts, profile_type, component, address) are embedded in the token's Q field, not in URL query."
					}
				},
				{
					"name": "Error - Invalid Token",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status code is 500\", function () {",
									"    pm.response.to.have.status(500);",
									"});",
									"",
									"pm.test(\"Error response structure\", function () {",
									"    const jsonData = pm.response.json();",
									"    pm.expect(jsonData).to.have.property('error', true);",
									"    pm.expect(jsonData).to.have.property('message');",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/continuous_profiling/download?token=invalid_token&ts=1234567890&profile_type=cpu&component=tidb&address=127.0.0.1:10080",
							"host": ["{{base_url}}"],
							"path": ["continuous_profiling", "download"],
							"query": [
								{
									"key": "token",
									"value": "invalid_token"
								},
								{
									"key": "ts",
									"value": "1234567890"
								},
								{
									"key": "profile_type",
									"value": "cpu"
								},
								{
									"key": "component",
									"value": "tidb"
								},
								{
									"key": "address",
									"value": "127.0.0.1:10080"
								}
							]
						},
						"description": "Test error handling with invalid token"
					}
				},
				{
					"name": "Error - Missing Query Parameters",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status code is 400\", function () {",
									"    pm.response.to.have.status(400);",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/continuous_profiling/download?token={{action_token}}",
							"host": ["{{base_url}}"],
							"path": ["continuous_profiling", "download"],
							"query": [
								{
									"key": "token",
									"value": "{{action_token}}"
								}
							]
						},
						"description": "Test error when required query parameters are missing"
					}
				}
			],
			"description": "Tests for downloading profiles"
		},
		{
			"name": "5. Single Profile View",
			"item": [
				{
					"name": "Success - TiDB CPU Profile",
					"event": [
						{
							"listen": "prerequest",
							"script": {
								"exec": [
									"if (!pm.environment.get('action_token')) {",
									"    pm.environment.set('action_token', '{{action_token}}');",
									"}",
									"const now = Math.floor(Date.now() / 1000);",
									"const fiveMinutesAgo = now - 300;",
									"pm.environment.set('five_minutes_ago', fiveMinutesAgo.toString());"
								],
								"type": "text/javascript"
							}
						},
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status code is 200 or 400 (no data)\", function () {",
									"    pm.expect(pm.response.code).to.be.oneOf([200, 400]);",
									"});",
									"",
									"pm.test(\"Response body is not empty or error\", function () {",
									"    if (pm.response.code === 200) {",
									"        pm.expect(pm.response.body).to.not.be.empty;",
									"    } else {",
									"        // 400 means no profile data found, which is acceptable",
									"        pm.expect(pm.response.code).to.equal(400);",
									"    }",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/continuous_profiling/single_profile/view?token={{action_token}}",
							"host": ["{{base_url}}"],
							"path": ["continuous_profiling", "single_profile", "view"],
							"query": [
								{
									"key": "token",
									"value": "{{action_token}}",
									"description": "Token contains all query params in Q field"
								}
							]
						},
						"description": "View single TiDB CPU profile (for speedscope). Note: query params are embedded in the token's Q field."
					}
				},
				{
					"name": "Success - TiKV Heap Profile",
					"event": [
						{
							"listen": "prerequest",
							"script": {
								"exec": [
									"if (!pm.environment.get('tikv_heap_token')) {",
									"    pm.environment.set('tikv_heap_token', '{{action_token}}');",
									"}",
									"const now = Math.floor(Date.now() / 1000);",
									"const fiveMinutesAgo = now - 300;",
									"pm.environment.set('five_minutes_ago', fiveMinutesAgo.toString());"
								],
								"type": "text/javascript"
							}
						},
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status code is 200 or 400 (no data)\", function () {",
									"    pm.expect(pm.response.code).to.be.oneOf([200, 400]);",
									"});",
									"",
									"pm.test(\"Content-Type is text/plain for heap profile or error\", function () {",
									"    if (pm.response.code === 200) {",
									"        const contentType = pm.response.headers.get('Content-Type');",
									"        if (contentType) {",
									"            pm.expect(contentType).to.include('text/plain');",
									"        }",
									"    } else {",
									"        // 400 means no profile data found, which is acceptable",
									"        pm.expect(pm.response.code).to.equal(400);",
									"    }",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/continuous_profiling/single_profile/view?token={{tikv_heap_token}}",
							"host": ["{{base_url}}"],
							"path": ["continuous_profiling", "single_profile", "view"],
							"query": [
								{
									"key": "token",
									"value": "{{tikv_heap_token}}",
									"description": "Token contains all query params in Q field"
								}
							]
						},
						"description": "View TiKV heap profile (requires perl conversion). Note: query params are embedded in the token's Q field."
					}
				},
				{
					"name": "Error - Invalid Token",
					"event": [
						{
							"listen": "test",
							"script": {
								"exec": [
									"pm.test(\"Status code is 500\", function () {",
									"    pm.response.to.have.status(500);",
									"});"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{base_url}}/continuous_profiling/single_profile/view?token=invalid_token&ts=1234567890&profile_type=cpu&component=tidb&address=127.0.0.1:10080",
							"host": ["{{base_url}}"],
							"path": ["continuous_profiling", "single_profile", "view"],
							"query": [
								{
									"key": "token",
									"value": "invalid_token"
								},
								{
									"key": "ts",
									"value": "1234567890"
								},
								{
									"key": "profile_type",
									"value": "cpu"
								},
								{
									"key": "component",
									"value": "tidb"
								},
								{
									"key": "address",
									"value": "127.0.0.1:10080"
								}
							]
						},
						"description": "Test error handling with invalid token"
					}
				}
			],
			"description": "Tests for viewing single profiles"
		},
		{
			"name": "6. Provider-Specific Tests",
			"item": [
				{
					"name": "AWS Provider",
					"event": [
						{
							"listen": "prerequest",
							"script": {
								"exec": [
									"const now = Math.floor(Date.now() / 1000);",
									"const oneHourAgo = now - 3600;",
									"pm.environment.set('current_timestamp', now.toString());",
									"pm.environment.set('one_hour_ago', oneHourAgo.toString());"
								],
								"type": "text/javascript"
							}
						}
					],
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "x-provider",
								"value": "aws"
							},
							{
								"key": "x-region",
								"value": "us-west-2"
							},
							{
								"key": "x-org-id",
								"value": "{{org_id}}"
							},
							{
								"key": "x-cluster-id",
								"value": "{{cluster_id}}"
							},
							{
								"key": "x-deploy-type",
								"value": "{{deploy_type}}"
							}
						],
						"url": {
							"raw": "{{base_url}}/continuous_profiling/group_profiles?begin_time={{one_hour_ago}}&end_time={{current_timestamp}}",
							"host": ["{{base_url}}"],
							"path": ["continuous_profiling", "group_profiles"],
							"query": [
								{
									"key": "begin_time",
									"value": "{{one_hour_ago}}"
								},
								{
									"key": "end_time",
									"value": "{{current_timestamp}}"
								}
							]
						},
						"description": "Test with AWS provider"
					}
				},
				{
					"name": "GCP Provider",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "x-provider",
								"value": "gcp"
							},
							{
								"key": "x-region",
								"value": "us-central1"
							},
							{
								"key": "x-org-id",
								"value": "{{org_id}}"
							},
							{
								"key": "x-cluster-id",
								"value": "{{cluster_id}}"
							},
							{
								"key": "x-deploy-type",
								"value": "{{deploy_type}}"
							}
						],
						"url": {
							"raw": "{{base_url}}/continuous_profiling/group_profiles?begin_time={{one_hour_ago}}&end_time={{current_timestamp}}",
							"host": ["{{base_url}}"],
							"path": ["continuous_profiling", "group_profiles"],
							"query": [
								{
									"key": "begin_time",
									"value": "{{one_hour_ago}}"
								},
								{
									"key": "end_time",
									"value": "{{current_timestamp}}"
								}
							]
						},
						"description": "Test with GCP provider"
					}
				},
				{
					"name": "Azure Provider",
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "x-provider",
								"value": "azure"
							},
							{
								"key": "x-region",
								"value": "eastus"
							},
							{
								"key": "x-org-id",
								"value": "{{org_id}}"
							},
							{
								"key": "x-cluster-id",
								"value": "{{cluster_id}}"
							},
							{
								"key": "x-deploy-type",
								"value": "{{deploy_type}}"
							}
						],
						"url": {
							"raw": "{{base_url}}/continuous_profiling/group_profiles?begin_time={{one_hour_ago}}&end_time={{current_timestamp}}",
							"host": ["{{base_url}}"],
							"path": ["continuous_profiling", "group_profiles"],
							"query": [
								{
									"key": "begin_time",
									"value": "{{one_hour_ago}}"
								},
								{
									"key": "end_time",
									"value": "{{current_timestamp}}"
								}
							]
						},
						"description": "Test with Azure provider"
					}
				}
			],
			"description": "Tests for different cloud providers"
		}
	]
}
