{"id":43641,"date":"2024-01-19T05:39:15","date_gmt":"2023-09-03T01:45:57","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8python%e5%b0%86prometheus%e4%b8%adpod%e7%9a%84%e8%b5%84%e6%ba%90%e4%bd%bf%e7%94%a8%e6%95%b0%e6%8d%ae%e5%af%bc%e5%87%ba%e4%b8%bacsv%e6%96%87%e4%bb%b6%e3%80%82\/"},"modified":"2025-07-30T02:55:07","modified_gmt":"2025-07-29T18:55:07","slug":"%e4%bd%bf%e7%94%a8python%e5%b0%86prometheus%e4%b8%adpod%e7%9a%84%e8%b5%84%e6%ba%90%e4%bd%bf%e7%94%a8%e6%95%b0%e6%8d%ae%e5%af%bc%e5%87%ba%e4%b8%bacsv%e6%96%87%e4%bb%b6%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8python%e5%b0%86prometheus%e4%b8%adpod%e7%9a%84%e8%b5%84%e6%ba%90%e4%bd%bf%e7%94%a8%e6%95%b0%e6%8d%ae%e5%af%bc%e5%87%ba%e4%b8%bacsv%e6%96%87%e4%bb%b6%e3%80%82\/","title":{"rendered":"\u4f7f\u7528Python\u5c06Prometheus\u4e2dPod\u7684\u8d44\u6e90\u4f7f\u7528\u6570\u636e\u5bfc\u51fa\u4e3acsv\u6587\u4ef6"},"content":{"rendered":"<p>\u4eceIBM Cloud Private\u7684\u5305\u542b\u7684Prometheus\u4e2d\u5c06\u6570\u636e\u5bfc\u51fa\u4e3aCSV\u6587\u4ef6\u7684Python\u7684\u5907\u5fd8\u5f55\u3002<\/p>\n<p>\u5047\u8bbe\u5e0c\u671b\u5728\u4f20\u7edf\u7cfb\u7edf\u4e2d\uff0c\u4f7f\u7528Excel\u521b\u5efa\u5e76\u62a5\u544a\u6bcf\u4e2aPod\u7684CPU\u4f7f\u7528\u7387\u7b49\u6027\u80fd\u4fe1\u606f\u62a5\u544a\u3002<\/p>\n<p>\u6211\u4f1a\u4f7f\u7528ICP v3.1.0\u8fdb\u884c\u786e\u8ba4\u3002\u7531\u4e8e\u5728Mac\u4e0a\u6267\u884c\u547d\u4ee4\uff0c\u6240\u4ee5\u5728Linux\u4e0a\uff0ccurl\u548cdate\u7b49\u7684\u884c\u4e3a\u53ef\u80fd\u4f1a\u6709\u4e9b\u4e0d\u540c\u3002<\/p>\n<h2>\u666e\u7f57\u7c73\u4fee\u65af\u67e5\u8be2<\/h2>\n<p>\u672c\u6587\u672a\u63d0\u53ca\u6709\u5173Prometheus\u67e5\u8be2\u7684\u5185\u5bb9\uff0c\u4f46\u5efa\u8bae\u67e5\u770b\u4ee5\u4e0b\u94fe\u63a5\u3002<\/p>\n<ul class=\"post-ul\">Prometheus\u30af\u30a8\u30ea\u9053\u5834<\/ul>\n<p>\u4f8b\u5982\uff0c\u8981\u83b7\u53d6Namespace\u6bcf\u4e2aPod\u7684CPU\u4f7f\u7528\u7387\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u67e5\u8be2\u3002<\/p>\n<pre class=\"post-pre\"><code>sum(rate(container_cpu_usage_seconds_total{namespace=\"default\"}[5m])) by (pod_name) * 100\r\n<\/code><\/pre>\n<p>\u5f53\u6211\u4eec\u6309\u987a\u5e8f\u67e5\u770b\u8fd9\u4e2a\u67e5\u8be2\u7684\u8fc7\u7a0b\uff0c\u5b83\u4f1a\u53d8\u6210\u4ee5\u4e0b\u8fd9\u6837\u3002\u867d\u7136\u6570\u636e\u7c7b\u578b\u548crate()\u51fd\u6570\u53ef\u80fd\u4e0d\u592a\u5bb9\u6613\u7406\u89e3\uff0c\u4f46\u8fd9\u662f\u91cd\u70b9\u3002<\/p>\n<p>container_cpu_usage_seconds_total\u306f\u30b3\u30f3\u30c6\u30ca\u304c\u4f7f\u7528\u3057\u305fCPU\u6642\u9593\u306e\u7a4d\u7b97\u5024\u3067\u3001\u3053\u306e\u30af\u30a8\u30ea\u30fc\u306f\u8907\u6570\u306e\u30b3\u30f3\u30c6\u30ca\u306e\u3042\u308b\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7\u306b\u304a\u3051\u308b\u30c7\u30fc\u30bf\u304c\u8fd4\u3063\u3066\u304f\u308b\uff08Instant vector\u578b\u306e\u30c7\u30fc\u30bf\uff09<\/p>\n<p>container_cpu_usage_seconds_total{namespace=&#8221;default&#8221;}\u306e\u3088\u3046\u306b\u3001\u30e9\u30d9\u30eb\u3067\u30c7\u30fc\u30bf\u3092\u7d5e\u308b\u3053\u3068\u304c\u3067\u304d\u308b\uff08Instant vector\u578b\u306e\u30c7\u30fc\u30bf\uff09<\/p>\n<p>container_cpu_usage_seconds_total{namespace=&#8221;default&#8221;}[5m]\u3068\u3059\u308b\u3053\u3068\u3067\u3001\u30c7\u30fc\u30bf\u306e\u671f\u9593\u3092\u6307\u5b9a\u3057\u3066\u3044\u3066\u3001\u8907\u6570\u306e\u30b3\u30f3\u30c6\u30ca\u306e\u8907\u6570\u306e\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7\u306b\u6e21\u308b\u30c7\u30fc\u30bf\u304c\u8fd4\u3063\u3066\u304f\u308b\uff08Range vector\u578b\u306e\u30c7\u30fc\u30bf\uff09<\/p>\n<p>rate(container_cpu_usage_seconds_total{namespace=&#8221;default&#8221;}[5m])\u3068\u3059\u308b\u3053\u3068\u3067\u3001\u6307\u5b9a\u671f\u9593\u306e1\u79d2\u5f53\u305f\u308a\u306e\u5e73\u5747\u306e\u5897\u5206\u3092\u51fa\u3057\u3066\u3044\u308b\uff08Instant vector\u578b\u306e\u30c7\u30fc\u30bf\uff09<\/p>\n<p>1\u79d2\u5f53\u305f\u308aCPU\u4f7f\u7528\u6642\u9593\u304c0.5\u79d2\u5897\u3048\u3066\u3044\u305f\u3068\u3059\u308b\u3068\u3001CPU\u4f7f\u7528\u7387\u306f0.5\uff0850%\uff09\u3068\u3044\u3046\u3053\u3068\u306b\u306a\u308b<\/p>\n<p>sum(rate(container_cpu_usage_seconds_total{namespace=&#8221;default&#8221;}[5m])) by (pod_name)\u3067\u8907\u6570\u306e\u30c7\u30fc\u30bf\u3092Pod\u6bce\u306b\u5408\u8a08\u3057\u3066\u3044\u308b\uff08Instant vector\u578b\u306e\u30c7\u30fc\u30bf\uff09<\/p>\n<p>Pod\u5185\u306b\u306f\u8907\u6570\u306e\u30b3\u30f3\u30c6\u30ca\u304c\u3044\u308b\u5834\u5408\u304c\u3042\u308b\u306e\u3067\u3001Pod\u6bce\u306b\u3053\u306e\u3088\u3046\u306a\u5408\u8a08\u3092\u3057\u3066\u3044\u308b<\/p>\n<h2>\u4eceGrafana\u5bfc\u51fa<\/h2>\n<p>\u901a\u8fc7Grafana\u4eea\u8868\u677f\uff0c\u53ef\u4ee5\u901a\u8fc7GUI\u4ee5\u9762\u677f\u4e3a\u5355\u4f4d\u8fdb\u884cCSV\u5bfc\u51fa\u3002\u5728\u4eea\u8868\u677f\u4e0a\uff0c\u60a8\u53ef\u4ee5\u6307\u5b9a\u6570\u636e\u7684\u65f6\u95f4\u8303\u56f4\uff0c\u5e76\u6839\u636e\u4eea\u8868\u677f\u8bbe\u7f6e\u7684\u53d8\u91cf\uff08\u4f8b\u5982interval\u548cNamespace\uff09\u6765\u663e\u793a\u6240\u9700\u7684\u6570\u636e\u3002\u5728\u5c06\u9762\u677f\u7684\u6807\u9898\u90e8\u5206\u70b9\u51fb\u4e00\u4e0b\u540e\uff0c\u5373\u53ef\u901a\u8fc7CSV\u8fdb\u884c\u5bfc\u51fa\u3002\u6d4f\u89c8\u5668\u4e0a\u7684JavaScript\u5df2\u5c06\u5df2\u4e0b\u8f7d\u7684JSON\u6570\u636e\u8f6c\u6362\u4e3aCSV\u6587\u4ef6\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d53bf37434c4406cd085b\/11-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u5728\u5bfc\u51fa\u65f6\uff0c\u8fd8\u53ef\u4ee5\u8fdb\u884c\u4e00\u4e9b\u8bbe\u7f6e\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d53bf37434c4406cd085b\/13-0.png\" alt=\"image.png\" \/><\/div>\n<h2>\u4f7f\u7528curl<\/h2>\n<p>\u63a5\u4e0b\u6765\u5c1d\u8bd5\u4f7f\u7528curl\u83b7\u53d6\u6570\u636e\u3002<\/p>\n<h3>\u786e\u8ba4\u7528\u6237\u8eab\u4efd<\/h3>\n<p>\u8981\u8bbf\u95eePrometheus API\uff0c\u9700\u8981\u4f7f\u7528\u4ee4\u724c\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8 API \u30b3\u30de\u30f3\u30c9\u307e\u305f\u306f\u7ba1\u7406 API \u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3059\u308b\u305f\u3081\u306e\u6e96\u5099<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Prometheus API<\/ul>\n<p>\u867d\u7136\u8ba4\u4e3a\u9700\u8981ID\u4ee4\u724c\uff0c\u4f46\u9700\u8981\u8bbf\u95eePrometheus API\u7684\u4e0d\u662fID\u4ee4\u724c\uff0c\u800c\u662f\u8bbf\u95ee\u4ee4\u724c\uff0c\u8bf7\u6ce8\u610f\u3002<\/p>\n<p>\u5982\u679c\u672c\u5730\u5df2\u7ecf\u4f7f\u7528cloudctl login\u767b\u5f55\uff0c\u5c31\u53ef\u4ee5\u901a\u8fc7cloudctl tokens\u83b7\u53d6\u4ee4\u724c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">ACCESS_TOKEN<\/span><span class=\"o\">=<\/span><span class=\"si\">$(<\/span><span class=\"nv\">LANG<\/span><span class=\"o\">=<\/span>C cloudctl tokens | <span class=\"nb\">grep<\/span> <span class=\"s2\">\"Access token:\"<\/span> | <span class=\"nb\">awk<\/span> <span class=\"s1\">'{print ($4)}'<\/span><span class=\"si\">)<\/span>\r\n<\/code><\/pre>\n<p>\u8fd8\u53ef\u4ee5\u5c06\u7528\u6237\u540d\u548c\u5bc6\u7801\u4f20\u9012\u7ed9API\u6765\u83b7\u53d6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">USERNAME<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"admin\"<\/span>\r\n<span class=\"nv\">PASSWORD<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"admin\"<\/span>\r\n<span class=\"nv\">ACCESS_TOKEN<\/span><span class=\"o\">=<\/span><span class=\"si\">$(<\/span>curl <span class=\"nt\">-s<\/span> <span class=\"nt\">-k<\/span> <span class=\"nt\">-H<\/span> <span class=\"s2\">\"Content-Type: application\/x-www-form-urlencoded;charset=UTF-8\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">-d<\/span> <span class=\"s2\">\"grant_type=password&amp;username=<\/span><span class=\"k\">${<\/span><span class=\"nv\">USERNAME<\/span><span class=\"k\">}<\/span><span class=\"s2\">&amp;password=<\/span><span class=\"k\">${<\/span><span class=\"nv\">PASSWORD<\/span><span class=\"k\">}<\/span><span class=\"s2\">&amp;scope=openid\"<\/span> <span class=\"se\">\\<\/span>\r\n  https:\/\/mycluster.icp:8443\/idprovider\/v1\/auth\/identitytoken | jq <span class=\"nt\">-r<\/span> <span class=\"s1\">'.access_token'<\/span><span class=\"si\">)<\/span>\r\n<\/code><\/pre>\n<h3>\u67e5\u8be2\u786e\u8ba4<\/h3>\n<p>\u901a\u8fc7\u70b9\u51fbGrafana\u4eea\u8868\u677f\u9762\u677f\u6807\u9898\u4e0a\u7684&#8221;Edit&#8221;\uff0c\u53ef\u4ee5\u786e\u8ba4\u4f7f\u7528\u4e86\u54ea\u4e9bPrometheus\u67e5\u8be2\u3002$interval\u548c$namespace\u662f\u4ece\u4eea\u8868\u677f\u5b9a\u4e49\u7684\u53d8\u91cf\u7ec4\u4ef6\u4e2d\u4f20\u9012\u7684\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d53bf37434c4406cd085b\/26-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u6b64\u5916\uff0c\u60a8\u8fd8\u53ef\u4ee5\u901a\u8fc7\u6253\u5f00\u67e5\u8be2\u5ba1\u67e5\u5668\u6765\u786e\u8ba4\u6240\u4f7f\u7528\u7684HTTP\u8bf7\u6c42\u7684\u8be6\u60c5\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d53bf37434c4406cd085b\/28-0.png\" alt=\"image.png\" \/><\/div>\n<p>GET\u8bf7\u6c42\u7684\u53c2\u6570\u5fc5\u987b\u5305\u62ecquery\u3001start\u3001end\u3001step\u3002\u5176\u4e2dstart\u548cend\u662f\u4ee5Epoch\u65f6\u95f4\u8868\u793a\u7684\uff0c\u800cstep\u8868\u793a\u6570\u636e\u70b9\u4e4b\u95f4\u7684\u95f4\u9694\u3002<\/p>\n<h3>\u8fd0\u884ccurl<\/h3>\n<p>\u4f7f\u7528curl\u8fdb\u884c\u8bf7\u6c42\u7684\u65b9\u6cd5\u5982\u4e0b\uff1a\u4f7f\u7528-H\u9009\u9879\u6dfb\u52a0\u7528\u4e8e\u8eab\u4efd\u9a8c\u8bc1\u7684\u6807\u5934\u3002\u901a\u8fc7&#8211;data-urlencoded\u9009\u9879\u5bf9\u6570\u636e\u8fdb\u884c\u7f16\u7801\uff0c\u5e76\u4f7f\u7528-G\u9009\u9879\u5c06\u5176\u4f5c\u4e3aGET\u8bf7\u6c42\u800c\u4e0d\u662fPOST\u8bf7\u6c42\u53d1\u9001\u3002<\/p>\n<pre class=\"post-pre\"><code>curl <span class=\"nt\">-k<\/span> <span class=\"nt\">-s<\/span> <span class=\"nt\">-G<\/span> <span class=\"nt\">-H<\/span> <span class=\"s2\">\"Authorization:Bearer <\/span><span class=\"nv\">$ACCESS_TOKEN<\/span><span class=\"s2\">\"<\/span> <span class=\"se\">\\<\/span>\r\n  https:\/\/mycluster.icp:8443\/prometheus\/api\/v1\/query_range <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--data-urlencode<\/span> <span class=\"s1\">'query=sum(rate(container_cpu_usage_seconds_total{namespace=\"default\"}[5m])) by (pod_name) * 100'<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--data-urlencode<\/span> <span class=\"s2\">\"start=1547517120\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--data-urlencode<\/span> <span class=\"s2\">\"end=1547527950\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--data-urlencode<\/span> <span class=\"s2\">\"step=30\"<\/span> | jq <span class=\"nb\">.<\/span>\r\n<\/code><\/pre>\n<p>\u5c06\u53c2\u6570\u8f6c\u5316\u4e3a\u53d8\u91cf\u5e76\u653e\u5728\u524d\u9762\uff0c\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">NAMESPACE<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"default\"<\/span>\r\n<span class=\"nv\">INTERVAL<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"5m\"<\/span>\r\n<span class=\"nv\">QUERY<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"sum(rate(container_cpu_usage_seconds_total{namespace=<\/span><span class=\"se\">\\\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">NAMESPACE<\/span><span class=\"k\">}<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">}[<\/span><span class=\"k\">${<\/span><span class=\"nv\">INTERVAL<\/span><span class=\"k\">}<\/span><span class=\"s2\">])) by (pod_name) * 100\"<\/span>\r\n<span class=\"nv\">START<\/span><span class=\"o\">=<\/span><span class=\"si\">$(<\/span><span class=\"nb\">date<\/span> <span class=\"nt\">-v<\/span> <span class=\"nt\">-1d<\/span> +%s<span class=\"si\">)<\/span>  <span class=\"c\"># 1\u65e5\u524d\u306e\u6642\u523b\u3092\u30a8\u30dd\u30c3\u30af\u30bf\u30a4\u30e0\u3067\u53d6\u5f97<\/span>\r\n<span class=\"nv\">END<\/span><span class=\"o\">=<\/span><span class=\"si\">$(<\/span><span class=\"nb\">date<\/span> +%s<span class=\"si\">)<\/span>           <span class=\"c\"># \u4eca\u306e\u6642\u523b\u3092\u30a8\u30dd\u30c3\u30af\u30bf\u30a4\u30e0\u3067\u53d6\u5f97<\/span>\r\n<span class=\"nv\">STEP<\/span><span class=\"o\">=<\/span>30\r\ncurl <span class=\"nt\">-k<\/span> <span class=\"nt\">-s<\/span> <span class=\"nt\">-G<\/span> <span class=\"nt\">-H<\/span> <span class=\"s2\">\"Authorization:Bearer <\/span><span class=\"nv\">$ACCESS_TOKEN<\/span><span class=\"s2\">\"<\/span> <span class=\"se\">\\<\/span>\r\n  https:\/\/mycluster.icp:8443\/prometheus\/api\/v1\/query_range <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--data-urlencode<\/span> <span class=\"s2\">\"query=<\/span><span class=\"k\">${<\/span><span class=\"nv\">QUERY<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--data-urlencode<\/span> <span class=\"s2\">\"start=<\/span><span class=\"k\">${<\/span><span class=\"nv\">START<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--data-urlencode<\/span> <span class=\"s2\">\"end=<\/span><span class=\"k\">${<\/span><span class=\"nv\">END<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--data-urlencode<\/span> <span class=\"s2\">\"step=<\/span><span class=\"k\">${<\/span><span class=\"nv\">STEP<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> | jq <span class=\"nb\">.<\/span>\r\n<\/code><\/pre>\n<p>\u8fd0\u884c\u540e\u5c06\u4ee5JSON\u683c\u5f0f\u8fd4\u56de\u5982\u4e0b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">$<\/span> curl <span class=\"nt\">-k<\/span> <span class=\"nt\">-s<\/span> <span class=\"nt\">-G<\/span> <span class=\"nt\">-H<\/span> <span class=\"s2\">\"Authorization:Bearer <\/span><span class=\"nv\">$ACCESS_TOKEN<\/span><span class=\"s2\">\"<\/span> <span class=\"se\">\\<\/span>\r\n<span class=\"o\">&gt;<\/span>   https:\/\/mycluster.icp:8443\/prometheus\/api\/v1\/query_range <span class=\"se\">\\<\/span>\r\n<span class=\"o\">&gt;<\/span>   <span class=\"nt\">--data-urlencode<\/span> <span class=\"s2\">\"query=<\/span><span class=\"k\">${<\/span><span class=\"nv\">QUERY<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> <span class=\"se\">\\<\/span>\r\n<span class=\"o\">&gt;<\/span>   <span class=\"nt\">--data-urlencode<\/span> <span class=\"s2\">\"start=<\/span><span class=\"k\">${<\/span><span class=\"nv\">START<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> <span class=\"se\">\\<\/span>\r\n<span class=\"o\">&gt;<\/span>   <span class=\"nt\">--data-urlencode<\/span> <span class=\"s2\">\"end=<\/span><span class=\"k\">${<\/span><span class=\"nv\">END<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> <span class=\"se\">\\<\/span>\r\n<span class=\"o\">&gt;<\/span>   <span class=\"nt\">--data-urlencode<\/span> <span class=\"s2\">\"step=<\/span><span class=\"k\">${<\/span><span class=\"nv\">STEP<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span> | jq <span class=\"nb\">.<\/span>\r\n<span class=\"go\">{\r\n  \"status\": \"success\",\r\n  \"data\": {\r\n    \"resultType\": \"matrix\",\r\n    \"result\": [\r\n      {\r\n        \"metric\": {\r\n          \"pod_name\": \"infra-test-nodeport-cust-0\"\r\n        },\r\n        \"values\": [\r\n          [\r\n            1547537972,\r\n            \"2.5491993487228775\"\r\n          ],\r\n          [\r\n            1547538002,\r\n            \"2.300661640484626\"\r\n          ],\r\n\uff08\u7701\u7565\uff09\r\n<\/span><\/code><\/pre>\n<h2>Python \u4eba\u5de5\u667a\u80fd<\/h2>\n<p>\u7531\u4e8e\u5c06 JSON \u8f6c\u6362\u4e3a CSV \u5728 Shell \u811a\u672c\u4e2d\u6709\u4e9b\u590d\u6742\uff0c\u6240\u4ee5\u5c1d\u8bd5\u4f7f\u7528 Python \u5b8c\u6210\u8fd9\u4e2a\u4efb\u52a1\u3002<\/p>\n<h3>\u7f16\u5199\u4ee3\u7801<\/h3>\n<p>\u7f16\u5199\u4ee5\u4e0b\u7c7b\u578b\u7684\u7a0b\u5e8f\u4ee3\u7801\u3002\u7531\u4e8e\u8fd8\u4e0d\u4e86\u89e3\u7f16\u5199\u826f\u597d\u7684\u4ee3\u7801\u7684\u65b9\u6cd5\uff0c\u6240\u4ee5\u91c7\u7528&#8221;\u8ba9Python\u505a\u65e0\u804a\u7684\u4e8b\u60c5&#8221;\u7684\u601d\u60f3\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kn\">import<\/span> <span class=\"nn\">argparse<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">collections<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">csv<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">datetime<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">logging<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">re<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">subprocess<\/span>\r\n\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">pprint<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">requests<\/span>\r\n<span class=\"kn\">import<\/span> <span class=\"nn\">urllib3<\/span>\r\n\r\n\r\n<span class=\"n\">formatter<\/span> <span class=\"o\">=<\/span> <span class=\"s\">'%(asctime)s %(name)-12s %(levelname)-8s %(message)s'<\/span>\r\n<span class=\"n\">logging<\/span><span class=\"p\">.<\/span><span class=\"n\">basicConfig<\/span><span class=\"p\">(<\/span><span class=\"n\">level<\/span><span class=\"o\">=<\/span><span class=\"n\">logging<\/span><span class=\"p\">.<\/span><span class=\"n\">WARNING<\/span><span class=\"p\">,<\/span> <span class=\"nb\">format<\/span><span class=\"o\">=<\/span><span class=\"n\">formatter<\/span><span class=\"p\">)<\/span>\r\n<span class=\"n\">logger<\/span> <span class=\"o\">=<\/span> <span class=\"n\">logging<\/span><span class=\"p\">.<\/span><span class=\"n\">getLogger<\/span><span class=\"p\">(<\/span><span class=\"n\">__name__<\/span><span class=\"p\">)<\/span>\r\n\r\n\r\n<span class=\"c1\"># \u8b66\u544a\u3092\u975e\u8868\u793a\u306b\u3059\u308b\r\n<\/span><span class=\"n\">urllib3<\/span><span class=\"p\">.<\/span><span class=\"n\">disable_warnings<\/span><span class=\"p\">(<\/span><span class=\"n\">urllib3<\/span><span class=\"p\">.<\/span><span class=\"n\">exceptions<\/span><span class=\"p\">.<\/span><span class=\"n\">InsecureRequestWarning<\/span><span class=\"p\">)<\/span>\r\n\r\n\r\n<span class=\"c1\"># \u30b3\u30de\u30f3\u30c9\u5f15\u6570\u306e\u51e6\u7406\r\n<\/span><span class=\"n\">parser<\/span> <span class=\"o\">=<\/span> <span class=\"n\">argparse<\/span><span class=\"p\">.<\/span><span class=\"n\">ArgumentParser<\/span><span class=\"p\">(<\/span><span class=\"n\">description<\/span><span class=\"o\">=<\/span><span class=\"s\">'Pod\u306eCPU\u4f7f\u7528\u7387\u3092csv\u306b\u51fa\u529b\u3057\u307e\u3059\u3002'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"n\">parser<\/span><span class=\"p\">.<\/span><span class=\"n\">add_argument<\/span><span class=\"p\">(<\/span><span class=\"s\">'-f'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'--filename'<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"n\">action<\/span><span class=\"o\">=<\/span><span class=\"s\">'store'<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"nb\">type<\/span><span class=\"o\">=<\/span><span class=\"nb\">str<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"n\">help<\/span><span class=\"o\">=<\/span><span class=\"s\">'\u51fa\u529b\u5148\u306e\u30d5\u30a1\u30a4\u30eb\u540d\u3092\u6307\u5b9a\u3057\u307e\u3059'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"n\">parser<\/span><span class=\"p\">.<\/span><span class=\"n\">add_argument<\/span><span class=\"p\">(<\/span><span class=\"s\">'-n'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'--namespace'<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"n\">action<\/span><span class=\"o\">=<\/span><span class=\"s\">'store'<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"nb\">type<\/span><span class=\"o\">=<\/span><span class=\"nb\">str<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"n\">default<\/span><span class=\"o\">=<\/span><span class=\"s\">'default'<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"n\">help<\/span><span class=\"o\">=<\/span><span class=\"s\">'Namespace\u3092\u6307\u5b9a\u3057\u307e\u3059'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"n\">parser<\/span><span class=\"p\">.<\/span><span class=\"n\">add_argument<\/span><span class=\"p\">(<\/span><span class=\"s\">'--interval'<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"n\">action<\/span><span class=\"o\">=<\/span><span class=\"s\">'store'<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"nb\">type<\/span><span class=\"o\">=<\/span><span class=\"nb\">str<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"n\">default<\/span><span class=\"o\">=<\/span><span class=\"s\">'5m'<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"n\">help<\/span><span class=\"o\">=<\/span><span class=\"s\">'CPU\u4f7f\u7528\u7387\u8a08\u7b97\u306b\u4f7f\u7528\u3059\u308b\u30c7\u30fc\u30bf\u306e\u9593\u9694\u3092\u6307\u5b9a\u3057\u307e\u3059\uff08\u4f8b\uff091h\u30015m'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"n\">parser<\/span><span class=\"p\">.<\/span><span class=\"n\">add_argument<\/span><span class=\"p\">(<\/span><span class=\"s\">'--start'<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"n\">action<\/span><span class=\"o\">=<\/span><span class=\"s\">'store'<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"nb\">type<\/span><span class=\"o\">=<\/span><span class=\"nb\">str<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"n\">help<\/span><span class=\"o\">=<\/span><span class=\"s\">'\u30c7\u30fc\u30bf\u306e\u958b\u59cb\u6642\u9593\u3092\u6307\u5b9a\u3057\u307e\u3059\uff08\u4f8b\uff0920190101-1000'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"n\">parser<\/span><span class=\"p\">.<\/span><span class=\"n\">add_argument<\/span><span class=\"p\">(<\/span><span class=\"s\">'--end'<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"n\">action<\/span><span class=\"o\">=<\/span><span class=\"s\">'store'<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"nb\">type<\/span><span class=\"o\">=<\/span><span class=\"nb\">str<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"n\">help<\/span><span class=\"o\">=<\/span><span class=\"s\">'\u30c7\u30fc\u30bf\u306e\u7d42\u4e86\u6642\u9593\u3092\u6307\u5b9a\u3057\u307e\u3059\uff08\u4f8b\uff0920190102-1000'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"n\">parser<\/span><span class=\"p\">.<\/span><span class=\"n\">add_argument<\/span><span class=\"p\">(<\/span><span class=\"s\">'--step'<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"n\">action<\/span><span class=\"o\">=<\/span><span class=\"s\">'store'<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"nb\">type<\/span><span class=\"o\">=<\/span><span class=\"nb\">int<\/span><span class=\"p\">,<\/span>\r\n                    <span class=\"n\">help<\/span><span class=\"o\">=<\/span><span class=\"s\">'\u30c7\u30fc\u30bf\u30dd\u30a4\u30f3\u30c8\u306e\u9593\u9694\uff08\u79d2\uff09\u3092\u6307\u5b9a\u3057\u307e\u3059'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"n\">args<\/span> <span class=\"o\">=<\/span> <span class=\"n\">parser<\/span><span class=\"p\">.<\/span><span class=\"n\">parse_args<\/span><span class=\"p\">()<\/span>\r\n\r\n<span class=\"n\">filepath<\/span> <span class=\"o\">=<\/span> <span class=\"n\">args<\/span><span class=\"p\">.<\/span><span class=\"n\">filename<\/span>\r\n<span class=\"n\">namespace<\/span> <span class=\"o\">=<\/span> <span class=\"n\">args<\/span><span class=\"p\">.<\/span><span class=\"n\">namespace<\/span>\r\n<span class=\"n\">interval<\/span> <span class=\"o\">=<\/span> <span class=\"n\">args<\/span><span class=\"p\">.<\/span><span class=\"n\">interval<\/span>\r\n<span class=\"n\">step<\/span> <span class=\"o\">=<\/span> <span class=\"n\">args<\/span><span class=\"p\">.<\/span><span class=\"n\">step<\/span>\r\n<span class=\"n\">logger<\/span><span class=\"p\">.<\/span><span class=\"n\">debug<\/span><span class=\"p\">(<\/span><span class=\"s\">'filepath: {}'<\/span><span class=\"p\">.<\/span><span class=\"nb\">format<\/span><span class=\"p\">(<\/span><span class=\"n\">filepath<\/span><span class=\"p\">))<\/span>\r\n<span class=\"n\">logger<\/span><span class=\"p\">.<\/span><span class=\"n\">debug<\/span><span class=\"p\">(<\/span><span class=\"s\">'interval: {}'<\/span><span class=\"p\">.<\/span><span class=\"nb\">format<\/span><span class=\"p\">(<\/span><span class=\"n\">interval<\/span><span class=\"p\">))<\/span>\r\n<span class=\"n\">logger<\/span><span class=\"p\">.<\/span><span class=\"n\">debug<\/span><span class=\"p\">(<\/span><span class=\"s\">'step: {}'<\/span><span class=\"p\">.<\/span><span class=\"nb\">format<\/span><span class=\"p\">(<\/span><span class=\"n\">step<\/span><span class=\"p\">))<\/span>\r\n\r\n<span class=\"c1\"># \u5f15\u6570\u306e\u958b\u59cb\u6642\u9593\u3068\u7d42\u4e86\u6642\u9593\u3092UNIX\u6642\u523b\u306b\u5909\u63db\r\n<\/span><span class=\"n\">start_str<\/span> <span class=\"o\">=<\/span> <span class=\"n\">args<\/span><span class=\"p\">.<\/span><span class=\"n\">start<\/span>\r\n<span class=\"n\">end_str<\/span> <span class=\"o\">=<\/span> <span class=\"n\">args<\/span><span class=\"p\">.<\/span><span class=\"n\">end<\/span>\r\n<span class=\"n\">start_dt<\/span> <span class=\"o\">=<\/span> <span class=\"n\">datetime<\/span><span class=\"p\">.<\/span><span class=\"n\">datetime<\/span><span class=\"p\">.<\/span><span class=\"n\">strptime<\/span><span class=\"p\">(<\/span><span class=\"n\">start_str<\/span><span class=\"p\">,<\/span> <span class=\"s\">'%Y%m%d-%H%M'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"n\">end_dt<\/span> <span class=\"o\">=<\/span> <span class=\"n\">datetime<\/span><span class=\"p\">.<\/span><span class=\"n\">datetime<\/span><span class=\"p\">.<\/span><span class=\"n\">strptime<\/span><span class=\"p\">(<\/span><span class=\"n\">end_str<\/span><span class=\"p\">,<\/span> <span class=\"s\">'%Y%m%d-%H%M'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"n\">start_unix<\/span> <span class=\"o\">=<\/span> <span class=\"n\">start_dt<\/span><span class=\"p\">.<\/span><span class=\"n\">timestamp<\/span><span class=\"p\">()<\/span>\r\n<span class=\"n\">end_unix<\/span> <span class=\"o\">=<\/span> <span class=\"n\">end_dt<\/span><span class=\"p\">.<\/span><span class=\"n\">timestamp<\/span><span class=\"p\">()<\/span>\r\n<span class=\"n\">logger<\/span><span class=\"p\">.<\/span><span class=\"n\">debug<\/span><span class=\"p\">(<\/span><span class=\"s\">'start_dt: {}'<\/span><span class=\"p\">.<\/span><span class=\"nb\">format<\/span><span class=\"p\">(<\/span><span class=\"n\">start_dt<\/span><span class=\"p\">))<\/span>\r\n<span class=\"n\">logger<\/span><span class=\"p\">.<\/span><span class=\"n\">debug<\/span><span class=\"p\">(<\/span><span class=\"s\">'end_dt: {}'<\/span><span class=\"p\">.<\/span><span class=\"nb\">format<\/span><span class=\"p\">(<\/span><span class=\"n\">end_dt<\/span><span class=\"p\">))<\/span>\r\n<span class=\"n\">logger<\/span><span class=\"p\">.<\/span><span class=\"n\">debug<\/span><span class=\"p\">(<\/span><span class=\"s\">'start_unix: {}'<\/span><span class=\"p\">.<\/span><span class=\"nb\">format<\/span><span class=\"p\">(<\/span><span class=\"n\">start_unix<\/span><span class=\"p\">))<\/span>\r\n<span class=\"n\">logger<\/span><span class=\"p\">.<\/span><span class=\"n\">debug<\/span><span class=\"p\">(<\/span><span class=\"s\">'end_unix: {}'<\/span><span class=\"p\">.<\/span><span class=\"nb\">format<\/span><span class=\"p\">(<\/span><span class=\"n\">end_unix<\/span><span class=\"p\">))<\/span>\r\n\r\n<span class=\"c1\"># \u30b5\u30d6\u30d7\u30ed\u30bb\u30b9\u3067\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3001\u7d50\u679c\u304b\u3089\u30a2\u30af\u30bb\u30b9\u30c8\u30fc\u30af\u30f3\u3092\u62bd\u51fa\r\n<\/span><span class=\"n\">completed_process<\/span> <span class=\"o\">=<\/span> <span class=\"n\">subprocess<\/span><span class=\"p\">.<\/span><span class=\"n\">run<\/span><span class=\"p\">([<\/span><span class=\"s\">'cloudctl'<\/span><span class=\"p\">,<\/span> <span class=\"s\">'tokens'<\/span><span class=\"p\">],<\/span> <span class=\"n\">stdout<\/span><span class=\"o\">=<\/span><span class=\"n\">subprocess<\/span><span class=\"p\">.<\/span><span class=\"n\">PIPE<\/span><span class=\"p\">)<\/span>\r\n<span class=\"n\">result_str<\/span> <span class=\"o\">=<\/span> <span class=\"n\">completed_process<\/span><span class=\"p\">.<\/span><span class=\"n\">stdout<\/span><span class=\"p\">.<\/span><span class=\"n\">decode<\/span><span class=\"p\">(<\/span><span class=\"s\">'utf-8'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"n\">match<\/span> <span class=\"o\">=<\/span> <span class=\"n\">re<\/span><span class=\"p\">.<\/span><span class=\"n\">search<\/span><span class=\"p\">(<\/span><span class=\"sa\">r<\/span><span class=\"s\">'(.*)\\s+Bearer\\s+(.*)'<\/span><span class=\"p\">,<\/span> <span class=\"n\">result_str<\/span><span class=\"p\">)<\/span>\r\n<span class=\"n\">access_token<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"n\">match<\/span><span class=\"p\">.<\/span><span class=\"n\">group<\/span><span class=\"p\">(<\/span><span class=\"mi\">2<\/span><span class=\"p\">))<\/span>\r\n<span class=\"n\">logger<\/span><span class=\"p\">.<\/span><span class=\"n\">debug<\/span><span class=\"p\">(<\/span><span class=\"s\">'access_token: {}'<\/span><span class=\"p\">.<\/span><span class=\"nb\">format<\/span><span class=\"p\">(<\/span><span class=\"n\">access_token<\/span><span class=\"p\">))<\/span>\r\n\r\n<span class=\"c1\"># Prometheus\u30af\u30a8\u30ea\u30fc\r\n# \u6307\u5b9a\u306eNamespace\u306e\u3001\u6307\u5b9a\u306einterval\u3067\u7b97\u51fa\u3057\u305fPod\u6bce\u306eCPU\u4f7f\u7528\u7387\u3092\u53d6\u5f97\u3059\u308b\r\n# sum(rate(container_cpu_usage_seconds_total{namespace=\"$namespace\"}[$interval])) by (pod_name) * 100\r\n<\/span><span class=\"n\">query<\/span> <span class=\"o\">=<\/span> <span class=\"s\">'sum(rate(container_cpu_usage_seconds_total{{namespace=\"{}\"}}[{}])) '<\/span> \\\r\n        <span class=\"s\">'by (pod_name) * 100'<\/span><span class=\"p\">.<\/span><span class=\"nb\">format<\/span><span class=\"p\">(<\/span><span class=\"n\">namespace<\/span><span class=\"p\">,<\/span> <span class=\"n\">interval<\/span><span class=\"p\">)<\/span>\r\n<span class=\"n\">logger<\/span><span class=\"p\">.<\/span><span class=\"n\">debug<\/span><span class=\"p\">(<\/span><span class=\"s\">'query: {}'<\/span><span class=\"p\">.<\/span><span class=\"nb\">format<\/span><span class=\"p\">(<\/span><span class=\"n\">query<\/span><span class=\"p\">))<\/span>\r\n\r\n<span class=\"c1\"># \u30ea\u30af\u30a8\u30b9\u30c8\r\n<\/span><span class=\"n\">url<\/span> <span class=\"o\">=<\/span> <span class=\"s\">'https:\/\/mycluster.icp:8443\/prometheus\/api\/v1\/query_range'<\/span>\r\n<span class=\"n\">headers<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span><span class=\"s\">'Authorization'<\/span><span class=\"p\">:<\/span> <span class=\"s\">'Bearer {}'<\/span><span class=\"p\">.<\/span><span class=\"nb\">format<\/span><span class=\"p\">(<\/span><span class=\"n\">access_token<\/span><span class=\"p\">)}<\/span>\r\n<span class=\"n\">params<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span><span class=\"s\">'query'<\/span><span class=\"p\">:<\/span> <span class=\"n\">query<\/span><span class=\"p\">,<\/span>\r\n          <span class=\"s\">'start'<\/span><span class=\"p\">:<\/span> <span class=\"n\">start_unix<\/span><span class=\"p\">,<\/span>\r\n          <span class=\"s\">'end'<\/span><span class=\"p\">:<\/span> <span class=\"n\">end_unix<\/span><span class=\"p\">,<\/span>\r\n          <span class=\"s\">'step'<\/span><span class=\"p\">:<\/span> <span class=\"n\">step<\/span><span class=\"p\">}<\/span>\r\n<span class=\"n\">logger<\/span><span class=\"p\">.<\/span><span class=\"n\">debug<\/span><span class=\"p\">(<\/span><span class=\"s\">'url: {}'<\/span><span class=\"p\">.<\/span><span class=\"nb\">format<\/span><span class=\"p\">(<\/span><span class=\"n\">url<\/span><span class=\"p\">))<\/span>\r\n<span class=\"n\">logger<\/span><span class=\"p\">.<\/span><span class=\"n\">debug<\/span><span class=\"p\">(<\/span><span class=\"s\">'headers: {}'<\/span><span class=\"p\">.<\/span><span class=\"nb\">format<\/span><span class=\"p\">(<\/span><span class=\"n\">headers<\/span><span class=\"p\">))<\/span>\r\n<span class=\"n\">logger<\/span><span class=\"p\">.<\/span><span class=\"n\">debug<\/span><span class=\"p\">(<\/span><span class=\"s\">'params: {}'<\/span><span class=\"p\">.<\/span><span class=\"nb\">format<\/span><span class=\"p\">(<\/span><span class=\"n\">params<\/span><span class=\"p\">))<\/span>\r\n\r\n\r\n<span class=\"c1\"># \u30ea\u30af\u30a8\u30b9\u30c8\u3092\u5b9f\u884c\r\n<\/span><span class=\"n\">response<\/span> <span class=\"o\">=<\/span> <span class=\"n\">requests<\/span><span class=\"p\">.<\/span><span class=\"n\">get<\/span><span class=\"p\">(<\/span><span class=\"n\">url<\/span><span class=\"p\">,<\/span> <span class=\"n\">verify<\/span><span class=\"o\">=<\/span><span class=\"bp\">False<\/span><span class=\"p\">,<\/span> <span class=\"n\">headers<\/span><span class=\"o\">=<\/span><span class=\"n\">headers<\/span><span class=\"p\">,<\/span> <span class=\"n\">params<\/span><span class=\"o\">=<\/span><span class=\"n\">params<\/span><span class=\"p\">)<\/span>\r\n<span class=\"n\">response<\/span><span class=\"p\">.<\/span><span class=\"n\">raise_for_status<\/span><span class=\"p\">()<\/span>\r\n<span class=\"n\">logger<\/span><span class=\"p\">.<\/span><span class=\"n\">debug<\/span><span class=\"p\">(<\/span><span class=\"s\">'response: {}'<\/span><span class=\"p\">.<\/span><span class=\"nb\">format<\/span><span class=\"p\">(<\/span><span class=\"n\">response<\/span><span class=\"p\">))<\/span>\r\n\r\n<span class=\"c1\"># \u30ec\u30b9\u30dd\u30f3\u30b9\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u30c7\u30fc\u30bf\r\n# pprint.pprint(response.json())\r\n# {'data': {'result': [{'metric': {'pod_name': 'infra-test-nodeport-cust-0'},\r\n#                       'values': [[1547528400, '2.64939279124293'],\r\n#                                  [1547532000, '2.5820633706497045'],\r\n#                                  [1547535600, '2.562417181158173'],\r\n#                                  [1547539200, '2.4563804665536724'],\r\n<\/span>\r\n<span class=\"c1\"># \u610f\u5473\u306e\u306a\u3044\u90e8\u5206\u3092\u53d6\u308a\u9664\u3044\u3066\u4e2d\u306e\u30ea\u30b9\u30c8\u3092\u53d6\u308a\u51fa\u3059\r\n<\/span><span class=\"n\">results<\/span> <span class=\"o\">=<\/span> <span class=\"n\">response<\/span><span class=\"p\">.<\/span><span class=\"n\">json<\/span><span class=\"p\">()[<\/span><span class=\"s\">'data'<\/span><span class=\"p\">][<\/span><span class=\"s\">'result'<\/span><span class=\"p\">]<\/span>\r\n\r\n<span class=\"c1\"># \u53d6\u308a\u51fa\u3057\u305f\u306e\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u30c7\u30fc\u30bf\r\n# pprint.pprint(results)\r\n# [{'metric': {'pod_name': 'infra-test-nodeport-cust-0'},\r\n#   'values': [[1547528400, '2.64939279124293'],\r\n#              [1547532000, '2.5820633706497045'],\r\n#              [1547535600, '2.562417181158173'],\r\n#              [1547539200, '2.4563804665536724'],\r\n#\r\n# \u3053\u306e\u30c7\u30fc\u30bf\u3092\u6642\u523b\u3092\u30ad\u30fc\u306b\u3057\u3066\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u8f9e\u66f8\u306b\u307e\u3068\u3081\u308b\r\n#\r\n# {1547464889.632: {'infra-test-nodeport-cust-0': '3.1518179124293577',\r\n#                   'infra-test-nodeport-cust-1': '1.530811175762711',\r\n#                   'infra-test-nodeport2-cus-0': '3.0063879859887037',\r\n#                   'infra-test-nodeport2-cus-1': '1.5241500936723127'},\r\n#  1547468489.632: {'infra-test-nodeport-cust-0': '3.161739384943495',\r\n#                   'infra-test-nodeport-cust-1': '1.5393470943785368',\r\n#                   'infra-test-nodeport2-cus-0': '2.8831145322598943',\r\n#                   'infra-test-nodeport2-cus-1': '1.578976048757047'},\r\n<\/span>\r\n<span class=\"c1\"># \u6642\u523b\u6bce\u306e\u30c7\u30fc\u30bf\u306e\u8f9e\u66f8\u3092\u7528\u610f\u3059\u308b\r\n<\/span><span class=\"n\">time_series<\/span> <span class=\"o\">=<\/span> <span class=\"n\">collections<\/span><span class=\"p\">.<\/span><span class=\"n\">defaultdict<\/span><span class=\"p\">(<\/span><span class=\"nb\">dict<\/span><span class=\"p\">)<\/span>\r\n\r\n<span class=\"c1\"># Pod\u540d\u306eSet\u3092\u7528\u610f\u3059\u308b\r\n<\/span><span class=\"n\">pod_names<\/span> <span class=\"o\">=<\/span> <span class=\"nb\">set<\/span><span class=\"p\">()<\/span>\r\n\r\n<span class=\"k\">for<\/span> <span class=\"n\">result<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">results<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"c1\"># Pod\u540d\u3092\u53d6\u308a\u51fa\u3057\u3066Set\u306b\u5165\u308c\u3066\u304a\u304f\r\n<\/span>    <span class=\"n\">pod_name<\/span> <span class=\"o\">=<\/span> <span class=\"n\">result<\/span><span class=\"p\">[<\/span><span class=\"s\">'metric'<\/span><span class=\"p\">][<\/span><span class=\"s\">'pod_name'<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"n\">pod_names<\/span><span class=\"p\">.<\/span><span class=\"n\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">pod_name<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"k\">for<\/span> <span class=\"n\">value<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">result<\/span><span class=\"p\">[<\/span><span class=\"s\">'values'<\/span><span class=\"p\">]:<\/span>\r\n        <span class=\"c1\"># timestamp\u3092\u8f9e\u66f8\u306e\u30ad\u30fc\u306b\u3059\u308b\u3053\u3068\u3067\u540c\u3058timestamp\u306e\u30c7\u30fc\u30bf\u3092\u307e\u3068\u3081\u308b\r\n<\/span>        <span class=\"c1\"># defaultdict\u3092\u4f7f\u3046\u3053\u3068\u3067\u30ad\u30fc\u304c\u306a\u304f\u3066\u3082KeyError\u306b\u306a\u3089\u306a\u3044\r\n<\/span>        <span class=\"n\">time_series<\/span><span class=\"p\">[<\/span><span class=\"n\">value<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]][<\/span><span class=\"n\">pod_name<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"n\">value<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span>\r\n\r\n<span class=\"c1\"># pprint.pprint(time_series)\r\n<\/span>\r\n<span class=\"c1\"># csv\u306e\u30d8\u30c3\u30c0\u30fc\u306f\u6642\u523b\u3068Pod\u540d\u306b\u3059\u308b\r\n<\/span><span class=\"n\">fieldnames<\/span> <span class=\"o\">=<\/span> <span class=\"p\">[<\/span><span class=\"s\">'timestamp'<\/span><span class=\"p\">]<\/span>\r\n<span class=\"n\">fieldnames<\/span><span class=\"p\">.<\/span><span class=\"n\">extend<\/span><span class=\"p\">(<\/span><span class=\"n\">pod_names<\/span><span class=\"p\">)<\/span>\r\n\r\n<span class=\"c1\"># csv\u30d5\u30a1\u30a4\u30eb\u306b\u4fdd\u5b58\u3059\u308b\r\n<\/span><span class=\"k\">with<\/span> <span class=\"nb\">open<\/span><span class=\"p\">(<\/span><span class=\"n\">filepath<\/span><span class=\"p\">,<\/span> <span class=\"s\">'w'<\/span><span class=\"p\">)<\/span> <span class=\"k\">as<\/span> <span class=\"n\">csv_file<\/span><span class=\"p\">:<\/span>\r\n\r\n    <span class=\"n\">writer<\/span> <span class=\"o\">=<\/span> <span class=\"n\">csv<\/span><span class=\"p\">.<\/span><span class=\"n\">DictWriter<\/span><span class=\"p\">(<\/span><span class=\"n\">csv_file<\/span><span class=\"p\">,<\/span> <span class=\"n\">fieldnames<\/span><span class=\"o\">=<\/span><span class=\"n\">fieldnames<\/span><span class=\"p\">)<\/span>\r\n    <span class=\"n\">writer<\/span><span class=\"p\">.<\/span><span class=\"n\">writeheader<\/span><span class=\"p\">()<\/span>\r\n\r\n    <span class=\"c1\"># \u8f9e\u66f8\u304b\u3089\u6642\u9593\u6bce\u306e\u30c7\u30fc\u30bf\u3092\u53d6\u308a\u51fa\u3057\u3066\u30eb\u30fc\u30d7\u3059\u308b\r\n<\/span>    <span class=\"k\">for<\/span> <span class=\"n\">timestamp<\/span><span class=\"p\">,<\/span> <span class=\"n\">values<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">time_series<\/span><span class=\"p\">.<\/span><span class=\"n\">items<\/span><span class=\"p\">():<\/span>\r\n        <span class=\"c1\"># \u884c\u306b\u6642\u9593\u306e\u5217\u3092\u8ffd\u52a0\r\n<\/span>        <span class=\"n\">row<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span><span class=\"s\">'timestamp'<\/span><span class=\"p\">:<\/span> <span class=\"n\">datetime<\/span><span class=\"p\">.<\/span><span class=\"n\">datetime<\/span><span class=\"p\">.<\/span><span class=\"n\">fromtimestamp<\/span><span class=\"p\">(<\/span><span class=\"n\">timestamp<\/span><span class=\"p\">)}<\/span>\r\n        <span class=\"c1\"># values\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u8f9e\u66f8\r\n<\/span>        <span class=\"c1\"># {'infra-test-nodeport-cust-0': '2.467225521553685',\r\n<\/span>        <span class=\"c1\">#  'infra-test-nodeport-cust-1': '1.5932590068361583',\r\n<\/span>        <span class=\"c1\">#  'infra-test-nodeport2-cus-0': '2.2811341803954917',\r\n<\/span>        <span class=\"c1\">#  'infra-test-nodeport2-cus-1': '1.6517850743220521'},\r\n<\/span>        <span class=\"c1\"># \u4e8b\u524d\u306b\u683c\u7d0d\u3057\u305fPod\u540d\u306e\u30ea\u30b9\u30c8\u306e\u65b9\u3067\u30eb\u30fc\u30d7\u3059\u308b\r\n<\/span>        <span class=\"k\">for<\/span> <span class=\"n\">pod_name<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">pod_names<\/span><span class=\"p\">:<\/span>\r\n            <span class=\"k\">try<\/span><span class=\"p\">:<\/span>\r\n                <span class=\"n\">row<\/span><span class=\"p\">[<\/span><span class=\"n\">pod_name<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"n\">values<\/span><span class=\"p\">[<\/span><span class=\"n\">pod_name<\/span><span class=\"p\">]<\/span>\r\n            <span class=\"k\">except<\/span> <span class=\"nb\">KeyError<\/span><span class=\"p\">:<\/span>\r\n                <span class=\"c1\"># values\u306b\u3053\u306ePod\u306e\u30c7\u30fc\u30bf\u304c\u306a\u3044\u3068\u304d\u306fKeyError\u304c\u767a\u751f\u3059\u308b\u306e\u3067\u7a7a\u30c7\u30fc\u30bf\u3092\u5165\u308c\u308b\r\n<\/span>                <span class=\"n\">row<\/span><span class=\"p\">[<\/span><span class=\"n\">pod_name<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"s\">''<\/span>\r\n        <span class=\"n\">writer<\/span><span class=\"p\">.<\/span><span class=\"n\">writerow<\/span><span class=\"p\">(<\/span><span class=\"n\">row<\/span><span class=\"p\">)<\/span>\r\n<\/code><\/pre>\n<h3>\u57f7\u884c\u6848\u4f8b<\/h3>\n<p>\u9700\u8981\u4f7f\u7528 `request` \u6a21\u5757\u3002<\/p>\n<pre class=\"post-pre\"><code>pip install requests\r\n<\/code><\/pre>\n<p>\u7531\u65bc\u5728\u5b50\u9032\u7a0b\u4e2d\u57f7\u884c\u4e86cloudctl token\u4ee5\u7372\u53d6\u4ee4\u724c\uff0c\u6240\u4ee5\u9700\u8981\u4f7f\u7528cloudctl\u547d\u4ee4\uff0c\u4e26\u4e14\u9700\u8981\u4e8b\u5148\u767b\u9304\u3002<\/p>\n<p>\u8fd0\u884c\u540e\uff0c\u60a8\u53ef\u4ee5\u83b7\u53d6\u5230\u4ee5\u4e0bcsv\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">$<\/span> python export_pod_cpu.py <span class=\"nt\">--help<\/span>\r\n<span class=\"go\">usage: export_pod_cpu.py [-h] [-f FILENAME] [-n NAMESPACE]\r\n                         [--interval INTERVAL] [--start START] [--end END]\r\n                         [--step STEP]\r\n\r\nPod\u306eCPU\u4f7f\u7528\u7387\u3092csv\u306b\u51fa\u529b\u3057\u307e\u3059\u3002\r\n\r\noptional arguments:\r\n  -h, --help            show this help message and exit\r\n  -f FILENAME, --filename FILENAME\r\n                        \u51fa\u529b\u5148\u306e\u30d5\u30a1\u30a4\u30eb\u540d\u3092\u6307\u5b9a\u3057\u307e\u3059\r\n  -n NAMESPACE, --namespace NAMESPACE\r\n                        Namespace\u3092\u6307\u5b9a\u3057\u307e\u3059\r\n  --interval INTERVAL   CPU\u4f7f\u7528\u7387\u8a08\u7b97\u306b\u4f7f\u7528\u3059\u308b\u30c7\u30fc\u30bf\u306e\u9593\u9694\u3092\u6307\u5b9a\u3057\u307e\u3059\uff08\u4f8b\uff091h\u30015m\r\n  --start START         \u30c7\u30fc\u30bf\u306e\u958b\u59cb\u6642\u9593\u3092\u6307\u5b9a\u3057\u307e\u3059\uff08\u4f8b\uff0920190101-1000\r\n  --end END             \u30c7\u30fc\u30bf\u306e\u7d42\u4e86\u6642\u9593\u3092\u6307\u5b9a\u3057\u307e\u3059\uff08\u4f8b\uff0920190102-1000\r\n  --step STEP           \u30c7\u30fc\u30bf\u30dd\u30a4\u30f3\u30c8\u306e\u9593\u9694\uff08\u79d2\uff09\u3092\u6307\u5b9a\u3057\u307e\u3059\r\n<\/span><span class=\"gp\">$<\/span> python export_pod_cpu.py <span class=\"nt\">-f<\/span> test.csv <span class=\"nt\">-n<\/span> default <span class=\"nt\">--interval<\/span> 5m <span class=\"nt\">--start<\/span> 20190115-1600 <span class=\"nt\">--end<\/span> 20190116-1600 <span class=\"nt\">--step<\/span> 600\r\n<span class=\"gp\">$<\/span> <span class=\"nb\">cat <\/span>test.csv\r\n<span class=\"go\">timestamp,infra-test-nodeport-cust-1,infra-test-nodeport2-cus-1,infra-test-nodeport2-cus-0,infra-test-nodeport-cust-0\r\n2019-01-15 16:00:00,1.7765650066665255,1.5227466104164478,2.4642478804166026,2.7171226995831903\r\n2019-01-15 16:10:00,1.4900129837500724,1.4548672362502657,2.3264455262498513,2.7998607379167124\r\n2019-01-15 16:20:00,1.7629794254168016,1.6523557370834396,2.231762218333415,2.040916205000182\r\n2019-01-15 16:30:00,1.87828389291667,1.8159218674998103,1.7364743683333472,2.4042730716670726\r\n2019-01-15 16:40:00,1.6692312762499266,1.7964510670833533,2.264148609108464,2.300661640484626\r\n2019-01-15 16:50:00,1.7293341049999826,1.7319731500000066,1.8862790512499334,2.091235875833111\r\n\r\n\uff08\u7701\u7565\uff09\r\n\r\n2019-01-16 15:00:00,1.4205530700000204,1.450829464166835,2.229421241249838,2.6200906879167483\r\n2019-01-16 15:10:00,1.207286078750182,1.4032802437501837,1.8004293182339135,2.120460568511992\r\n2019-01-16 15:20:00,1.2547518466667875,1.5286131908334255,1.8340893729164995,2.258688518749826\r\n2019-01-16 15:30:00,1.2122690649999868,1.3929129920832868,2.2814286763049063,2.8766292608645045\r\n2019-01-16 15:40:00,1.4557575473232511,1.2478161367336864,1.8957547083334705,2.535229864166316\r\n2019-01-16 15:50:00,1.0475173487499962,1.2800040254167773,1.750940527916403,2.7946370483334704\r\n2019-01-16 16:00:00,1.4323884024997824,1.3961431675001752,2.2708808758333516,2.626497514166885\r\n<\/span><span class=\"gp\">$<\/span>\r\n<\/code><\/pre>\n<h3>\u4ee5\u4e0b\u662f\u8981\u6c42\u7684\u53e5\u5b50\u7684\u6c49\u8bed\u8868\u8ff0\uff1a<\/h3>\n<p>&#8211; \u8bf7\u5b8c\u6210\u4ee5\u4e0b\u4efb\u52a1\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u65e5\u6642\u3092\u30ed\u30fc\u30ab\u30eb\u6642\u523b\u3067\u6307\u5b9a\u3057\u3066\u308b\u304c\u3001UTC\u3067\u6307\u5b9a\u3067\u304d\u308b\u65b9\u304c\u4fbf\u5229\u304b\u3082\u3057\u308c\u306a\u3044<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">CPU\u3057\u304b\u3084\u3063\u3066\u306a\u3044\u306e\u3067\u30e1\u30e2\u30ea\u30fc\u4f7f\u7528\u91cf\u3082\u5fc5\u8981<\/ul>\n<\/li>\n<\/ul>\n<p>openpyxl\u30e2\u30b8\u30e5\u30fc\u30eb\u3068\u304b\u3092\u4f7f\u3063\u3066\u30a8\u30af\u30bb\u30eb\u306b\u3059\u308b\u3068\u3053\u308d\u307e\u3067\u3084\u3063\u3066\u3082\u3088\u3055\u305d\u3046<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4eceIBM Cloud Private\u7684\u5305\u542b\u7684Prometheus\u4e2d\u5c06\u6570\u636e\u5bfc\u51fa\u4e3aCSV\u6587\u4ef6\u7684Python\u7684\u5907\u5fd8\u5f55 [&hellip;]<\/p>\n","protected":false},"author":11,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[69,73,33,75,35,71,4,72,34,78,11,76,32,74,70,77],"class_list":["post-43641","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-api-authentication","tag-container-monitoring","tag-csv","tag-csv-export","tag-data-export","tag-data-processing","tag-kubernetes","tag-kubernetes-metrics","tag-monitoring","tag-performance-analysis","tag-prometheus","tag-prometheus-queries","tag-python","tag-python-programming","tag-query-optimization","tag-resource-monitoring"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Python Guide: Export Prometheus Pod Resource Usage Data to CSV Files - Complete Tutorial<\/title>\n<meta name=\"description\" content=\"Learn how to export Prometheus Pod resource usage data to CSV files using Python. This comprehensive tutorial covers API authentication, query optimization, and data processing for efficient monitoring and analysis of Kubernetes container metrics.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528python\u5c06prometheus\u4e2dpod\u7684\u8d44\u6e90\u4f7f\u7528\u6570\u636e\u5bfc\u51fa\u4e3acsv\u6587\u4ef6\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4f7f\u7528Python\u5c06Prometheus\u4e2dPod\u7684\u8d44\u6e90\u4f7f\u7528\u6570\u636e\u5bfc\u51fa\u4e3acsv\u6587\u4ef6\" \/>\n<meta property=\"og:description\" content=\"Learn how to export Prometheus Pod resource usage data to CSV files using Python. This comprehensive tutorial covers API authentication, query optimization, and data processing for efficient monitoring and analysis of Kubernetes container metrics.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528python\u5c06prometheus\u4e2dpod\u7684\u8d44\u6e90\u4f7f\u7528\u6570\u636e\u5bfc\u51fa\u4e3acsv\u6587\u4ef6\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-09-03T01:45:57+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-07-29T18:55:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d53bf37434c4406cd085b\/11-0.png\" \/>\n<meta name=\"author\" content=\"\u65b0, \u97f5\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u65b0, \u97f5\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8python%e5%b0%86prometheus%e4%b8%adpod%e7%9a%84%e8%b5%84%e6%ba%90%e4%bd%bf%e7%94%a8%e6%95%b0%e6%8d%ae%e5%af%bc%e5%87%ba%e4%b8%bacsv%e6%96%87%e4%bb%b6%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8python%e5%b0%86prometheus%e4%b8%adpod%e7%9a%84%e8%b5%84%e6%ba%90%e4%bd%bf%e7%94%a8%e6%95%b0%e6%8d%ae%e5%af%bc%e5%87%ba%e4%b8%bacsv%e6%96%87%e4%bb%b6%e3%80%82\/\",\"name\":\"Python Guide: Export Prometheus Pod Resource Usage Data to CSV Files - Complete Tutorial\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-09-03T01:45:57+00:00\",\"dateModified\":\"2025-07-29T18:55:07+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9\"},\"description\":\"Learn how to export Prometheus Pod resource usage data to CSV files using Python. This comprehensive tutorial covers API authentication, query optimization, and data processing for efficient monitoring and analysis of Kubernetes container metrics.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8python%e5%b0%86prometheus%e4%b8%adpod%e7%9a%84%e8%b5%84%e6%ba%90%e4%bd%bf%e7%94%a8%e6%95%b0%e6%8d%ae%e5%af%bc%e5%87%ba%e4%b8%bacsv%e6%96%87%e4%bb%b6%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8python%e5%b0%86prometheus%e4%b8%adpod%e7%9a%84%e8%b5%84%e6%ba%90%e4%bd%bf%e7%94%a8%e6%95%b0%e6%8d%ae%e5%af%bc%e5%87%ba%e4%b8%bacsv%e6%96%87%e4%bb%b6%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8python%e5%b0%86prometheus%e4%b8%adpod%e7%9a%84%e8%b5%84%e6%ba%90%e4%bd%bf%e7%94%a8%e6%95%b0%e6%8d%ae%e5%af%bc%e5%87%ba%e4%b8%bacsv%e6%96%87%e4%bb%b6%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4f7f\u7528Python\u5c06Prometheus\u4e2dPod\u7684\u8d44\u6e90\u4f7f\u7528\u6570\u636e\u5bfc\u51fa\u4e3acsv\u6587\u4ef6\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9\",\"name\":\"\u65b0, \u97f5\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g\",\"caption\":\"\u65b0, \u97f5\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunxin\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8python%e5%b0%86prometheus%e4%b8%adpod%e7%9a%84%e8%b5%84%e6%ba%90%e4%bd%bf%e7%94%a8%e6%95%b0%e6%8d%ae%e5%af%bc%e5%87%ba%e4%b8%bacsv%e6%96%87%e4%bb%b6%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Python Guide: Export Prometheus Pod Resource Usage Data to CSV Files - Complete Tutorial","description":"Learn how to export Prometheus Pod resource usage data to CSV files using Python. This comprehensive tutorial covers API authentication, query optimization, and data processing for efficient monitoring and analysis of Kubernetes container metrics.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528python\u5c06prometheus\u4e2dpod\u7684\u8d44\u6e90\u4f7f\u7528\u6570\u636e\u5bfc\u51fa\u4e3acsv\u6587\u4ef6\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u4f7f\u7528Python\u5c06Prometheus\u4e2dPod\u7684\u8d44\u6e90\u4f7f\u7528\u6570\u636e\u5bfc\u51fa\u4e3acsv\u6587\u4ef6","og_description":"Learn how to export Prometheus Pod resource usage data to CSV files using Python. This comprehensive tutorial covers API authentication, query optimization, and data processing for efficient monitoring and analysis of Kubernetes container metrics.","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528python\u5c06prometheus\u4e2dpod\u7684\u8d44\u6e90\u4f7f\u7528\u6570\u636e\u5bfc\u51fa\u4e3acsv\u6587\u4ef6\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-09-03T01:45:57+00:00","article_modified_time":"2025-07-29T18:55:07+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d53bf37434c4406cd085b\/11-0.png"}],"author":"\u65b0, \u97f5","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u65b0, \u97f5","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"2 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8python%e5%b0%86prometheus%e4%b8%adpod%e7%9a%84%e8%b5%84%e6%ba%90%e4%bd%bf%e7%94%a8%e6%95%b0%e6%8d%ae%e5%af%bc%e5%87%ba%e4%b8%bacsv%e6%96%87%e4%bb%b6%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8python%e5%b0%86prometheus%e4%b8%adpod%e7%9a%84%e8%b5%84%e6%ba%90%e4%bd%bf%e7%94%a8%e6%95%b0%e6%8d%ae%e5%af%bc%e5%87%ba%e4%b8%bacsv%e6%96%87%e4%bb%b6%e3%80%82\/","name":"Python Guide: Export Prometheus Pod Resource Usage Data to CSV Files - Complete Tutorial","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-09-03T01:45:57+00:00","dateModified":"2025-07-29T18:55:07+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9"},"description":"Learn how to export Prometheus Pod resource usage data to CSV files using Python. This comprehensive tutorial covers API authentication, query optimization, and data processing for efficient monitoring and analysis of Kubernetes container metrics.","breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8python%e5%b0%86prometheus%e4%b8%adpod%e7%9a%84%e8%b5%84%e6%ba%90%e4%bd%bf%e7%94%a8%e6%95%b0%e6%8d%ae%e5%af%bc%e5%87%ba%e4%b8%bacsv%e6%96%87%e4%bb%b6%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8python%e5%b0%86prometheus%e4%b8%adpod%e7%9a%84%e8%b5%84%e6%ba%90%e4%bd%bf%e7%94%a8%e6%95%b0%e6%8d%ae%e5%af%bc%e5%87%ba%e4%b8%bacsv%e6%96%87%e4%bb%b6%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8python%e5%b0%86prometheus%e4%b8%adpod%e7%9a%84%e8%b5%84%e6%ba%90%e4%bd%bf%e7%94%a8%e6%95%b0%e6%8d%ae%e5%af%bc%e5%87%ba%e4%b8%bacsv%e6%96%87%e4%bb%b6%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u4f7f\u7528Python\u5c06Prometheus\u4e2dPod\u7684\u8d44\u6e90\u4f7f\u7528\u6570\u636e\u5bfc\u51fa\u4e3acsv\u6587\u4ef6"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9","name":"\u65b0, \u97f5","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g","caption":"\u65b0, \u97f5"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunxin\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8python%e5%b0%86prometheus%e4%b8%adpod%e7%9a%84%e8%b5%84%e6%ba%90%e4%bd%bf%e7%94%a8%e6%95%b0%e6%8d%ae%e5%af%bc%e5%87%ba%e4%b8%bacsv%e6%96%87%e4%bb%b6%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/43641","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=43641"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/43641\/revisions"}],"predecessor-version":[{"id":100126,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/43641\/revisions\/100126"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=43641"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=43641"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=43641"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}