{"id":829,"date":"2026-07-08T19:16:50","date_gmt":"2026-07-08T11:16:50","guid":{"rendered":"https:\/\/blog.itsmygo.uk\/2026\/07\/08\/vllm-%e6%8e%a8%e8%ab%96%e6%9c%8d%e5%8b%99%e7%9b%a3%e6%8e%a7%e5%af%a6%e6%88%b0%ef%bc%9aprometheus-grafana-mlflow%ef%bc%88%e9%99%84-5-%e5%80%8b%e8%b8%a9%e5%9d%91%e7%ad%86%e8%a8%98%ef%bc%89\/"},"modified":"2026-07-08T19:20:10","modified_gmt":"2026-07-08T11:20:10","slug":"vllm-%e6%8e%a8%e8%ab%96%e6%9c%8d%e5%8b%99%e7%9b%a3%e6%8e%a7%e5%af%a6%e6%88%b0%ef%bc%9aprometheus-grafana-mlflow%ef%bc%88%e9%99%84-5-%e5%80%8b%e8%b8%a9%e5%9d%91%e7%ad%86%e8%a8%98%ef%bc%89","status":"publish","type":"post","link":"https:\/\/blog.itsmygo.uk\/wordpress\/2026\/07\/08\/vllm-%e6%8e%a8%e8%ab%96%e6%9c%8d%e5%8b%99%e7%9b%a3%e6%8e%a7%e5%af%a6%e6%88%b0%ef%bc%9aprometheus-grafana-mlflow%ef%bc%88%e9%99%84-5-%e5%80%8b%e8%b8%a9%e5%9d%91%e7%ad%86%e8%a8%98%ef%bc%89\/","title":{"rendered":"vLLM \u63a8\u8ad6\u670d\u52d9\u76e3\u63a7\u5be6\u6230\uff1aPrometheus + Grafana + MLflow\uff08\u9644 5 \u500b\u8e29\u5751\u7b46\u8a18\uff09"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u81ea\u67b6 LLM \u63a8\u8ad6\uff08vLLM\uff09\u628a\u670d\u52d9\u8dd1\u8d77\u4f86\u53ea\u662f\u7b2c\u4e00\u6b65\u3002\u771f\u6b63\u4e0a\u7dda\u5f8c\u4f60\u6703\u60f3\u77e5\u9053\uff1a<strong>\u670d\u52d9\u5fd9\u4e0d\u5fd9\uff1f\u6703\u4e0d\u6703\u585e\u8eca\uff1f\u6162\u5728\u54ea\uff1fVRAM \u9084\u5269\u591a\u5c11\uff1f<\/strong> \u9019\u4e9b\u90fd\u5f97\u300c\u770b\u5f97\u898b\u300d\u624d\u597d\u7dad\u904b\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u9019\u7bc7\u628a\u6211\u5728\u5169\u5f35 RTX 4090\uff08\u7528 Dokploy \u4f48\u7f72\u4e00\u7d44 vLLM \u53e2\u96c6\uff09\u4e0a\u5efa\u7684\u76e3\u63a7\u6574\u7406\u6210\u4e00\u4efd\u5be6\u6230\u7b46\u8a18\uff1a<strong>Prometheus \u6536\u6578\u64da\u3001Grafana \u756b\u5716\u3001MLflow \u8a18\u9304\u6bcf\u4e00\u6b21\u547c\u53eb\u7684\u5167\u5bb9<\/strong>\u3002\u6700\u5f8c\u662f\u6211\u5be6\u969b\u8e29\u904e\u7684 <strong>5 \u500b\u5751<\/strong>\u2014\u2014\u6bcf\u500b\u90fd\u8b93\u6211\u5361\u4e86\u4e00\u9663\u5b50\uff0c\u5beb\u4e0b\u4f86\u8b93\u4f60\u5c11\u8d70\u51a4\u6789\u8def\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e09\u500b\u5de5\u5177\uff0c\u5404\u505a\u4e00\u4ef6\u4e8b<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>\u5de5\u5177<\/th>\n<th>\u767d\u8a71<\/th>\n<th>\u770b\u7684\u662f<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Prometheus<\/strong><\/td>\n<td>\u6642\u5e8f\u8cc7\u6599\u5eab <strong>+ \u67e5\u8a62\u5f15\u64ce<\/strong>\uff0c\u6bcf 15 \u79d2\u6293\u4e00\u6b21\u6578\u5b57\u3001\u5b58 N \u5929\uff0c\u9084\u80fd\u7576\u5834\u5e6b\u4f60\u7b97<\/td>\n<td>\u6578\u5b57\uff08\u5e7e\u500b\u8acb\u6c42\u3001\u5e7e\u500b token\u2026\uff09<\/td>\n<\/tr>\n<tr>\n<td><strong>Grafana<\/strong><\/td>\n<td>\u6f02\u4eae\u7684\u524d\u7aef\uff0c\u628a Prometheus \u7684\u6578\u5b57\u756b\u6210\u5716<\/td>\n<td>\u8da8\u52e2\u3001\u5100\u8868\u677f<\/td>\n<\/tr>\n<tr>\n<td><strong>MLflow<\/strong><\/td>\n<td>\u8a18\u9304\u6bcf\u4e00\u6b21 LLM \u547c\u53eb\u7684\u5b8c\u6574\u5167\u5bb9<\/td>\n<td>\u5167\u5bb9\uff08\u554f\u4e86\u4ec0\u9ebc\u3001\u7b54\u4ec0\u9ebc\u3001\u5e7e\u500b token\uff09<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e00\u53e5\u8a71\u5206\u5de5\uff1a<strong>Prometheus\/Grafana \u770b\u300c\u6578\u5b57\u8207\u8da8\u52e2\u300d\uff0cMLflow \u770b\u300c\u5167\u5bb9\u300d\u3002<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e00\u3001Prometheus\uff1a\u76f4\u63a5\u6293 vLLM \u7684 <code>\/metrics<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u597d\u6d88\u606f\uff1a<strong>vLLM \u539f\u751f\u5c31\u5728 <code>\/metrics<\/code> \u5410 Prometheus \u683c\u5f0f\u7684\u6307\u6a19<\/strong>\uff0c\u4e0d\u7528\u6539\u4efb\u4f55\u7a0b\u5f0f\u3002\u4f60\u53ea\u8981\u8b93 Prometheus \u5b9a\u6642\u53bb\u6293\uff08scrape\uff09\u5c31\u597d\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u5148\u78ba\u8a8d vLLM \u6709\u5728\u5410\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">curl -s http:\/\/<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">\u4f60\u7684-vllm<\/span>&gt;<\/span>:8000\/metrics | grep '^vllm:' | head\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Prometheus \u7684 scrape \u8a2d\u5b9a\uff08\u6211\u9019\u88e1\u6293 4 \u500b vLLM \u670d\u52d9\uff09\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># prometheus.yml<\/span>\n<span class=\"hljs-keyword\">global<\/span>:\n  scrape_interval: <span class=\"hljs-number\">15<\/span>s\nscrape_configs:\n  - job_name: vllm\n    metrics_path: \/metrics\n    static_configs:\n      - targets:\n          - <span class=\"hljs-number\">10.131<\/span><span class=\"hljs-number\">.28<\/span><span class=\"hljs-number\">.119<\/span>:<span class=\"hljs-number\">18000<\/span>   <span class=\"hljs-comment\"># LLM<\/span>\n          - <span class=\"hljs-number\">10.131<\/span><span class=\"hljs-number\">.28<\/span><span class=\"hljs-number\">.119<\/span>:<span class=\"hljs-number\">18003<\/span>   <span class=\"hljs-comment\"># ASR<\/span>\n          - <span class=\"hljs-number\">10.131<\/span><span class=\"hljs-number\">.28<\/span><span class=\"hljs-number\">.113<\/span>:<span class=\"hljs-number\">18001<\/span>   <span class=\"hljs-comment\"># OCR<\/span>\n          - <span class=\"hljs-number\">10.131<\/span><span class=\"hljs-number\">.28<\/span><span class=\"hljs-number\">.113<\/span>:<span class=\"hljs-number\">18002<\/span>   <span class=\"hljs-comment\"># Embeddings<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u9032 Prometheus UI \u7684 <strong>Status \u2192 Targets<\/strong>\uff0c\u9019 4 \u500b\u90fd\u8a72\u662f <code>up<\/code>\u3002\u82e5\u662f <code>down<\/code>\uff0c\u591a\u534a\u662f\u7db2\u8def\/\u9632\u706b\u7246\u6216 port \u4e0d\u5c0d\u3002<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">vLLM \u7684\u6307\u6a19\u6703\u81ea\u52d5\u5e36 <code>model_name<\/code>\u3001<code>instance<\/code> \u7b49 label\uff0c\u6240\u4ee5\u540c\u4e00\u500b Prometheus \u6293\u591a\u500b\u670d\u52d9\u4e5f\u5206\u5f97\u6e05\u695a\u3002<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e8c\u3001\u8a72\u770b\u54ea\u4e9b\u6307\u6a19\uff08vLLM \u5c08\u5c6c\uff09<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">vLLM \u7684\u6307\u6a19\u90fd\u662f <code>vllm:<\/code> \u958b\u982d\u3002\u65b0\u624b\u8a18\u9019\u5e7e\u500b\u6700\u6709\u611f\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>\u6307\u6a19<\/th>\n<th>\u767d\u8a71<\/th>\n<th>\u600e\u9ebc\u770b\u597d\u58de<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>vllm:num_requests_running<\/code><\/td>\n<td>\u73fe\u5728\u540c\u6642\u8655\u7406\u5e7e\u500b\u8acb\u6c42<\/td>\n<td>0\uff1d\u9592\u8457\uff1b\u6301\u7e8c\u5f88\u9ad8\uff1d\u5f88\u5fd9<\/td>\n<\/tr>\n<tr>\n<td><code>vllm:num_requests_waiting<\/code><\/td>\n<td>\u5e7e\u500b\u8acb\u6c42\u5728\u6392\u968a<\/td>\n<td><strong>>0 \u5c31\u662f\u585e\u8eca\u4e86<\/strong>\uff0c\u8981\u964d\u4e26\u767c\u6216\u52a0\u8cc7\u6e90<\/td>\n<\/tr>\n<tr>\n<td><code>vllm:kv_cache_usage_perc<\/code><\/td>\n<td>GPU \u7684 KV cache\uff08\u77ed\u671f\u8a18\u61b6\uff09\u7528\u6389\u5e7e\u6210\uff080~1\uff09<\/td>\n<td>\u8d8a\u63a5\u8fd1 1 \u8d8a\u5bb9\u6613\u6392\u968a\/\u62d2\u7d55<\/td>\n<\/tr>\n<tr>\n<td><code>vllm:generation_tokens_total<\/code><\/td>\n<td>\u7d2f\u7a4d\u751f\u6210\u4e86\u591a\u5c11 token<\/td>\n<td>\u914d <code>rate()<\/code> \u770b\u6bcf\u79d2\u541e\u5410<\/td>\n<\/tr>\n<tr>\n<td><code>vllm:prompt_tokens_total<\/code><\/td>\n<td>\u7d2f\u7a4d\u5403\u9032\u591a\u5c11 token<\/td>\n<td>\u770b\u8f38\u5165\u91cf<\/td>\n<\/tr>\n<tr>\n<td><code>vllm:request_success_total<\/code><\/td>\n<td>\u7d2f\u7a4d\u6210\u529f\u5e7e\u6b21<\/td>\n<td>\u914d <code>rate()<\/code> \u770b QPS<\/td>\n<\/tr>\n<tr>\n<td><code>vllm:e2e_request_latency_seconds<\/code><\/td>\n<td>\u7aef\u5230\u7aef\u5ef6\u9072\uff08\u542b\u6392\u968a\uff09<\/td>\n<td>\u76f4\u65b9\u5716\uff0c\u7528 p95 \u770b<\/td>\n<\/tr>\n<tr>\n<td><code>vllm:time_to_first_token_seconds<\/code><\/td>\n<td>\u9996 token \u5ef6\u9072\uff08TTFT\uff09<\/td>\n<td>\u76f4\u65b9\u5716\uff0c\u5f71\u97ff\u300c\u611f\u89ba\u5feb\u4e0d\u5feb\u300d<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">**p95** \u7684\u610f\u601d\u662f\u300c95% \u7684\u8acb\u6c42\u90fd\u6bd4\u9019\u500b\u503c\u5feb\u300d\u3002\u770b p95 \u6bd4\u770b\u5e73\u5747\u503c\u66f4\u80fd\u53cd\u6620\u6700\u6162\u90a3\u6279\u4eba\u7684\u9ad4\u9a57\u3002<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e09\u3001Prometheus \u4e0d\u53ea\u662f\u300c\u7d00\u9304\u300d\u2014\u2014\u5b83\u6703\u7b97<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5f88\u591a\u4eba\u4ee5\u70ba Prometheus \u53ea\u662f\u628a\u6578\u5b57\u5b58\u8d77\u4f86\u3002\u5176\u5be6\u5b83\u662f<strong>\u6642\u5e8f\u8cc7\u6599\u5eab + \u67e5\u8a62\u5f15\u64ce<\/strong>\uff0c\u7528 PromQL \u53ef\u4ee5<strong>\u7576\u5834\u8a08\u7b97<\/strong>\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"># \u7d2f\u7a4d\u578b\uff1a\u6bcf\u500b\u6a21\u578b\u7e3d\u5171\u751f\u6210\u591a\u5c11 <span class=\"hljs-selector-tag\">token<\/span>\n<span class=\"hljs-selector-tag\">vllm<\/span><span class=\"hljs-selector-pseudo\">:generation_tokens_total<\/span>\n\n# \u7b97\u901f\u7387\uff1a\u6700\u8fd1 5 \u5206\u9418\uff0c\u6bcf\u79d2\u751f\u6210\u5e7e\u500b <span class=\"hljs-selector-tag\">token<\/span>\uff08\u541e\u5410\u91cf\uff09\n<span class=\"hljs-selector-tag\">rate<\/span>(<span class=\"hljs-selector-tag\">vllm<\/span><span class=\"hljs-selector-pseudo\">:generation_tokens_total<\/span><span class=\"hljs-selector-attr\">&#91;5m]<\/span>)\n\n# \u7b97\u52a0\u7e3d\uff1a\u6240\u6709\u6a21\u578b\u52a0\u8d77\u4f86\u7684\u7e3d <span class=\"hljs-selector-tag\">token<\/span>\n<span class=\"hljs-selector-tag\">sum<\/span>(<span class=\"hljs-selector-tag\">vllm<\/span><span class=\"hljs-selector-pseudo\">:generation_tokens_total)<\/span>\n\n# \u7b97\u767e\u5206\u4f4d\uff1a<span class=\"hljs-selector-tag\">E2E<\/span> \u5ef6\u9072\u7684 <span class=\"hljs-selector-tag\">p95<\/span>\uff08\u76f4\u65b9\u5716\u5fc5\u5099\uff09\n<span class=\"hljs-selector-tag\">histogram_quantile<\/span>(\n  0<span class=\"hljs-selector-class\">.95<\/span>,\n  <span class=\"hljs-selector-tag\">sum<\/span>(<span class=\"hljs-selector-tag\">rate<\/span>(<span class=\"hljs-selector-tag\">vllm<\/span><span class=\"hljs-selector-pseudo\">:e2e_request_latency_seconds_bucket<\/span><span class=\"hljs-selector-attr\">&#91;5m]<\/span>)) <span class=\"hljs-selector-tag\">by<\/span> (<span class=\"hljs-selector-tag\">le<\/span>, <span class=\"hljs-selector-tag\">model_name<\/span>)\n)\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><strong>\u95dc\u9375\u89c0\u5ff5\uff1aGrafana \u5176\u5be6\u53ea\u662f\u500b\u6f02\u4eae\u7684\u524d\u7aef\u3002<\/strong> \u5b83\u756b\u7684\u6bcf\u4e00\u5f35\u5716\uff0c\u80cc\u5f8c\u90fd\u662f\u9001\u4e00\u53e5 PromQL \u7d66 Prometheus\u3001\u628a\u56de\u4f86\u7684\u6578\u5b57\u756b\u6210\u7dda\u3002\u6240\u4ee5\u300cGrafana \u770b\u5f97\u5230\u7684\uff0cPrometheus \u90fd\u67e5\u5f97\u5230\u300d\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u7528 Python \u76f4\u63a5\u6253 Prometheus HTTP API \u4e5f\u5f88\u65b9\u4fbf\uff08\u505a\u5065\u5eb7\u6aa2\u67e5\u8173\u672c\u5f88\u597d\u7528\uff09\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">import requests\nPROM = <span class=\"hljs-string\">\"http:\/\/10.131.28.113:19090\"<\/span>   <span class=\"hljs-comment\"># \u82e5\u6709\u5b50\u8def\u5f91\u8a18\u5f97\u5e36\uff08\u898b\u8e29\u5751 #2\uff09<\/span>\n\ndef promq(query):\n    r = requests.get(f<span class=\"hljs-string\">\"{PROM}\/api\/v1\/query\"<\/span>, params={<span class=\"hljs-string\">\"query\"<\/span>: query}, timeout=<span class=\"hljs-number\">8<\/span>)\n    <span class=\"hljs-keyword\">return<\/span> r.json()&#91;<span class=\"hljs-string\">\"data\"<\/span>]&#91;<span class=\"hljs-string\">\"result\"<\/span>]\n\n<span class=\"hljs-keyword\">for<\/span> m in promq(<span class=\"hljs-string\">\"sum by (model_name) (vllm:generation_tokens_total)\"<\/span>):\n    <span class=\"hljs-keyword\">print<\/span>(m&#91;<span class=\"hljs-string\">\"metric\"<\/span>].get(<span class=\"hljs-string\">\"model_name\"<\/span>), <span class=\"hljs-string\">\"=\"<\/span>, m&#91;<span class=\"hljs-string\">\"value\"<\/span>]&#91;<span class=\"hljs-number\">1<\/span>])\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u56db\u3001Grafana\uff1a\u628a\u6578\u5b57\u756b\u6210\u5716<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Grafana \u7528\u300cprovisioning\u300d\u81ea\u52d5\u639b datasource\uff0c\u958b\u7bb1\u5373\u7528\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># \/etc\/grafana\/provisioning\/datasources\/ds.yml<\/span>\napiVersion: <span class=\"hljs-number\">1<\/span>\ndatasources:\n  - name: Prometheus\n    type: prometheus\n    access: proxy\n    url: http:<span class=\"hljs-comment\">\/\/prometheus:9090      # \u2190 \u9019\u884c\u7b49\u4e0b\u6703\u8e29\u5751\uff08\u898b #2\uff09<\/span>\n    isDefault: <span class=\"hljs-keyword\">true<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u5100\u8868\u677f\u4e0d\u7528\u624b\u523b\uff0c\u53ef\u4ee5\u7528 API \u76f4\u63a5\u532f\u5165\u3002\u6838\u5fc3\u9762\u677f\u5c31 6 \u500b\uff1arunning\u3001waiting\u3001KV cache %\u3001token \u901f\u7387\u3001E2E p95\u3001TTFT p95\u3002\u7528\u4e0a\u9762\u90a3\u4e9b PromQL \u7576\u6bcf\u500b panel \u7684 query \u5373\u53ef\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u770b\u5716\u7684\u8a23\u7ac5<\/strong>\uff1a\u628a\u6642\u9593\u7bc4\u570d\u8a2d <strong>Last 15 minutes<\/strong>\u3001\u81ea\u52d5\u5237\u65b0 10s\uff0c\u7136\u5f8c<strong>\u88fd\u9020\u4e00\u9ede\u6d41\u91cf<\/strong>\uff08\u8dd1\u5e7e\u5341\u500b\u8acb\u6c42\uff09\u2014\u2014\u4f60\u5c31\u6703\u770b\u5230 running \u8df3\u8d77\u4f86\u3001token \u901f\u7387\u9686\u8d77\u3001\u5ef6\u9072\u51fa\u73fe\u6578\u64da\u9ede\u3002\u9592\u7f6e\u6642\u672c\u4f86\u5c31\u662f\u5e73\u7684\uff0c\u5225\u4ee5\u70ba\u58de\u4e86\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e94\u3001MLflow\uff1a\u770b\u300c\u6bcf\u4e00\u6b21\u547c\u53eb\u7684\u5167\u5bb9\u300d<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Grafana \u770b\u6578\u5b57\/\u8da8\u52e2\uff1b<strong>MLflow \u770b\u5167\u5bb9<\/strong>\u3002\u505a agent\u3001\u9664\u932f prompt \u6642\uff0c\u4f60\u6703\u60f3\u77e5\u9053\u300c\u9019\u6b21\u5230\u5e95\u554f\u4e86\u4ec0\u9ebc\u3001\u6a21\u578b\u56de\u4ec0\u9ebc\u3001\u82b1\u5e7e\u500b token\u300d\u3002MLflow 3 \u7684 tracing \u4e00\u884c\u5c31\u80fd\u958b\u81ea\u52d5\u8ffd\u8e64\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">import mlflow\nfrom openai import OpenAI\n\nmlflow.set_tracking_uri(<span class=\"hljs-string\">\"http:\/\/10.131.28.113:15000\"<\/span>)   <span class=\"hljs-comment\"># \u6709\u5b50\u8def\u5f91\u8a18\u5f97\u5e36 \/mlflow<\/span>\nmlflow.set_experiment(<span class=\"hljs-string\">\"my-agent\"<\/span>)\nmlflow.openai.autolog()          <span class=\"hljs-comment\"># \u2190 \u95dc\u9375\uff1a\u81ea\u52d5\u8ffd\u8e64\u6240\u6709 OpenAI \u547c\u53eb<\/span>\n\nclient = OpenAI(base_url=<span class=\"hljs-string\">\"http:\/\/10.131.28.119:18000\/v1\"<\/span>, api_key=<span class=\"hljs-string\">\"none\"<\/span>)\nclient.chat.completions.create(\n    model=<span class=\"hljs-string\">\"qwen3-4b\"<\/span>,\n    messages=&#91;{<span class=\"hljs-string\">\"role\"<\/span>: <span class=\"hljs-string\">\"user\"<\/span>, <span class=\"hljs-string\">\"content\"<\/span>: <span class=\"hljs-string\">\"hello\"<\/span>}],\n)\n<span class=\"hljs-comment\"># \u2192 \u6253\u958b MLflow UI \u7684 Traces \u5206\u9801\uff0c\u5c31\u80fd\u770b\u5230\u9019\u6b21\u547c\u53eb\u7684\u5b8c\u6574\u8f38\u5165\/\u8f38\u51fa\/token\/\u8017\u6642<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">MLflow \u5e6b\u4f60\u7684\uff1a<strong>\u9664\u932f<\/strong>\uff08agent \u70ba\u4ec0\u9ebc\u7b54\u932f\uff1f\u9ede\u958b\u90a3\u6b21 trace \u770b\u5b83\u5be6\u969b\u6536\u5230\/\u56de\u4ec0\u9ebc\uff09\u3001<strong>\u770b\u6210\u672c<\/strong>\uff08\u6bcf\u6b21\u5e7e\u500b token\uff09\u3001<strong>\u6bd4\u8f03<\/strong>\uff08\u63db prompt \u5f8c\u958b\u5169\u6b21 trace \u5c0d\u7167\uff09\u3002\u800c\u4e14\u5b83\u652f\u63f4 LangChain \/ LlamaIndex \/ DSPy \u7b49\u6846\u67b6\u7684 <code>autolog()<\/code>\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u516d\u3001\u8e29\u5751\u7b46\u8a18\uff08\u91cd\u9ede\u4f86\u4e86\uff09<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ee5\u4e0b\u662f\u6211\u5be6\u969b\u5361\u4f4f\u3001\u67e5\u4e86\u534a\u5929\u624d\u89e3\u6c7a\u7684 5 \u500b\u5751\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u5751 1\uff1avLLM \u6307\u6a19\u6539\u540d\u4e86\uff08<code>gpu_cache_usage_perc<\/code> \u2192 <code>kv_cache_usage_perc<\/code>\uff09<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5f88\u591a\u820a\u6559\u5b78\u3001\u820a\u5100\u8868\u677f\u7528\u7684\u662f <code>vllm:gpu_cache_usage_perc<\/code>\u3002\u4f46\u5728\u8f03\u65b0\u7684 vLLM\uff08\u6211\u9019\u662f 0.24\uff09\u5b83<strong>\u6539\u540d\u6210 <code>vllm:kv_cache_usage_perc<\/code><\/strong>\u3002\u7d50\u679c\u5c31\u662f\uff1aGrafana \u7684\u300cKV cache \u4f7f\u7528\u7387\u300d\u9762\u677f<strong>\u4e00\u76f4\u662f\u7a7a\u7684<\/strong>\uff0c\u6211\u9084\u4ee5\u70ba\u662f datasource \u58de\u4e86\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u6559\u8a13<\/strong>\uff1a\u9762\u677f\/\u67e5\u8a62\u67e5\u7121\u8cc7\u6599\u6642\uff0c\u5148\u53bb Prometheus \u78ba\u8a8d\u6307\u6a19\u540d\u5230\u5e95\u5b58\u4e0d\u5b58\u5728\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># \u5217\u51fa\u6240\u6709\u542b cache \u7684 vllm \u6307\u6a19\u540d<\/span>\ncurl -s http:<span class=\"hljs-comment\">\/\/&lt;prom&gt;\/api\/v1\/label\/__name__\/values \\<\/span>\n  | python3 -c <span class=\"hljs-string\">\"import json,sys; print(&#91;m for m in json.load(sys.stdin)&#91;'data'] if 'cache' in m])\"<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">\u5751 2\uff1aPrometheus \u639b\u5728\u5b50\u8def\u5f91\uff0cGrafana datasource \u8981\u4e00\u8d77\u6539<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u70ba\u4e86\u5c0d\u5916\uff08\u53ea\u958b 443\uff09\uff0c\u6211\u628a Prometheus \u7528 <code>--web.external-url=https:\/\/host\/prometheus<\/code> \u639b\u5230 <code>\/prometheus<\/code> \u5b50\u8def\u5f91\u3002\u7d50\u679c <strong>Grafana \u6574\u500b\u67e5\u4e0d\u5230\u8cc7\u6599<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u539f\u56e0\uff1a<code>--web.external-url<\/code> \u6703\u8b93 Prometheus \u7684 API \u53ea\u5728 <code>\/prometheus\/api\/...<\/code> \u5e95\u4e0b\u670d\u52d9\uff0c\u6839\u8def\u5f91 <code>\/api\/...<\/code> \u6703\u56de 302\u3002\u4f46 Grafana \u7684 datasource \u9084\u6307\u8457 <code>http:\/\/prometheus:9090<\/code>\uff08\u6c92\u5e36\u5b50\u8def\u5f91\uff09\u2192 \u67e5\u8a62\u4e00\u5f8b 302 \u2192 \u62ff\u4e0d\u5230 JSON\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u4fee\u6cd5<\/strong>\uff1adatasource \u7684 url \u4e5f\u8981\u5e36\u5b50\u8def\u5f91\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">url: http:<span class=\"hljs-comment\">\/\/prometheus:9090\/prometheus   # \u2190 \u8981\u8ddf Prometheus \u7684 route-prefix \u4e00\u81f4<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u540c\u7406\uff0c\u7a0b\u5f0f\u7528 Python \u6253 API\u3001MLflow \u7684 <code>set_tracking_uri<\/code>\uff0c\u53ea\u8981\u670d\u52d9\u639b\u4e86\u5b50\u8def\u5f91\uff0c<strong>\u5168\u90e8\u90fd\u8981\u5e36\u4e0a\u90a3\u6bb5\u5b50\u8def\u5f91<\/strong>\uff0c\u5426\u5247\u4e0d\u662f 404 \u5c31\u662f 302\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u5751 3\uff1aGrafana \u5716\u662f\u300c\u5e73\u7684\/\u7a7a\u7684\u300d\uff0c\u4f46\u5176\u5be6\u6c92\u58de<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5169\u500b\u6700\u5e38\u898b\u539f\u56e0\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li><strong>\u6642\u9593\u7bc4\u570d\u592a\u5927<\/strong>\uff1a\u8dd1\u4e00\u6b21\u6d41\u91cf\u5c31\u7d50\u675f\uff0c\u4f60\u537b\u7528\u300cLast 6 hours\u300d\u770b\uff0c\u90a3\u500b\u5c0f\u51f8\u8d77\u88ab\u58d3\u6210\u4e00\u689d\u7dda\u3002\u2192 \u6539 <strong>Last 15 minutes<\/strong> \u518d\u770b\u3002<\/li>\n\n\n<li><strong>\u67e5\u7684\u662f\u5373\u6642 gauge<\/strong>\uff1a\u50cf <code>vllm:num_requests_running<\/code> \u9019\u7a2e\uff0c\u9592\u7f6e\u6642\u672c\u4f86\u5c31\u662f 0\u3002\u60f3\u770b\u300c\u6709\u767c\u751f\u904e\u7684\u4e8b\u300d\u8981\u67e5<strong>\u7d2f\u7a4d\u578b\u8a08\u6578\u5668<\/strong>\uff08<code>..._total<\/code>\uff09\u6216\u5b83\u7684 <code>rate()<\/code>\u3002<\/li>\n\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u5751 4\uff1aPrometheus UI \u6253\u958b\u4e00\u7247\u7a7a\u767d\u2014\u2014\u5b83\u4e0d\u662f\u5100\u8868\u677f<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u65b0\u624b\u6700\u5bb9\u6613\u8aa4\u6703\uff1aPrometheus \u7684 Graph\/Query \u9801<strong>\u9810\u8a2d\u662f\u7a7a\u767d\u7684<\/strong>\uff0c\u4f60\u5f97\u81ea\u5df1\u5728\u6846\u6846\u88e1\u8cbc\u4e00\u53e5 PromQL\u3001\u6309 <strong>Execute<\/strong>\uff0c\u518d\u5207 <strong>Table<\/strong>\uff08\u770b\u7576\u524d\u503c\uff09\u6216 <strong>Graph<\/strong>\uff08\u770b\u8da8\u52e2\uff09\u3002\u5b83\u4e0d\u50cf Grafana \u6709\u73fe\u6210\u7684\u5716\u3002\u60f3\u8981\u4e00\u6253\u958b\u5c31\u6709\u5716\uff0c\u770b Grafana\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u5751 5\uff1a\u6539\u4e86\u8a2d\u5b9a\u537b\u6c92\u751f\u6548\u2014\u2014Docker Compose \u7684 inline config \u4e0d\u6703\u89f8\u767c\u91cd\u5efa<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u6211\u7528 compose \u7684\u5167\u5d4c <code>configs<\/code>\uff08inline content\uff09\u653e Prometheus\/Grafana \u7684\u8a2d\u5b9a\u3002\u6539\u5b8c\u8a2d\u5b9a\u91cd\u65b0 <code>docker compose up -d<\/code>\uff0c\u537b\u767c\u73fe<strong>\u5bb9\u5668\u6839\u672c\u6c92\u66f4\u65b0<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u539f\u56e0\uff1a<code>up -d<\/code> \u53ea\u5728\u300c\u670d\u52d9\u5b9a\u7fa9\uff08image \/ command \/ env\u2026\uff09\u300d\u8b8a\u52d5\u6642\u624d\u91cd\u5efa\u5bb9\u5668\uff1b<strong>\u300c\u53ea\u6709 config \u5167\u5bb9\u8b8a\u300d\u5b83\u5075\u6e2c\u4e0d\u5230<\/strong>\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u4fee\u6cd5<\/strong>\uff1a\u660e\u78ba force-recreate \u90a3\u500b\u670d\u52d9\uff1a<\/p>\n\n\n<div class=\"cbc-code-wrapper\"><div class=\"cbc-code-bar\"><button class=\"cbc-copy-button\">Copy<\/button><\/div><pre class=\"wp-block-code\"><span><code class=\"hljs\">docker compose up -d --force-recreate prometheus\n<\/code><\/span><\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\uff08\u9806\u5e36\u4e00\u63d0\uff1a\u5982\u679c\u4f60\u50cf\u6211\u4e00\u6a23\u7528 Dokploy \u7ba1 compose\uff0c\u5b83\u7684\u90e8\u7f72\u4e00\u6a23\u662f <code>up -d<\/code>\uff0c\u6240\u4ee5\u6539\u5167\u5d4c config \u5f8c\u4e5f\u8981\u624b\u52d5 force-recreate \u5c0d\u61c9\u5bb9\u5668\u3002\uff09<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u5c0f\u7d50<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>Prometheus<\/strong> \u6293 vLLM \u539f\u751f <code>\/metrics<\/code>\uff0c\u662f\u8cc7\u6599\u5eab\u4e5f\u662f\u8a08\u7b97\u5f15\u64ce\uff08<code>rate<\/code>\/<code>sum<\/code>\/<code>histogram_quantile<\/code>\uff09\u3002<\/li>\n\n\n<li><strong>Grafana<\/strong> \u662f\u524d\u7aef\uff0c\u756b\u7684\u90fd\u662f PromQL \u7684\u7d50\u679c\uff1b\u770b\u5716\u8a18\u5f97\u8a2d\u77ed\u6642\u9593\u7bc4\u570d + \u88fd\u9020\u6d41\u91cf\u3002<\/li>\n\n\n<li><strong>MLflow<\/strong> \u88dc\u4e0a\u300c\u5167\u5bb9\u300d\u5c64\uff0c<code>autolog()<\/code> \u4e00\u884c\u958b\u8ffd\u8e64\uff0c\u9664\u932f agent \u795e\u5668\u3002<\/li>\n\n\n<li>\u6700\u5bb9\u6613\u8e29\u7684\u5751\uff1a<strong>\u6307\u6a19\u6539\u540d<\/strong>\u3001<strong>\u5b50\u8def\u5f91\u8981\u4e00\u8def\u5e36\u5230\u5e95<\/strong>\u3001<strong>gauge \u9592\u7f6e=0 \u4e0d\u662f\u58de\u6389<\/strong>\u3001<strong>inline config \u8981 force-recreate<\/strong>\u3002<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u76e3\u63a7\u4e0d\u662f\u70ba\u4e86\u597d\u770b\uff0c\u662f\u70ba\u4e86<strong>\u51fa\u4e8b\u6642\u4f60\u67e5\u5f97\u5230\u3001\u5e73\u5e38\u4f60\u5b89\u5fc3<\/strong>\u3002\u5148\u628a\u9019\u5e7e\u500b\u6307\u6a19\u770b\u61c2\u3001\u628a\u9019\u5e7e\u500b\u5751\u907f\u958b\uff0c\u5c31\u80fd\u5c11\u5f88\u591a\u534a\u591c\u88ab\u53eb\u8d77\u4f86\u7684\u6a5f\u6703\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u7528 Prometheus + Grafana + MLflow \u76e3\u63a7\u81ea\u67b6\u7684 vLLM \u63a8\u8ad6\u670d\u52d9\u2014\u2014\u5f9e\u67b6\u69cb\u3001\u8a72\u770b\u54ea\u4e9b\u6307\u6a19\u3001PromQL \u67e5\u8a62\uff0c\u5230\u6211\u5be6\u969b\u8e29\u904e\u7684 5 \u500b\u5751\uff08\u6307\u6a19\u6539\u540d\u3001\u5b50\u8def\u5f91 datasource\u3001Dokploy \u4e0d\u91cd\u5efa\u2026\uff09\u3002<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"rolpb_likes":0,"footnotes":""},"categories":[846],"tags":[802,849,392,839,848,847,768],"class_list":["post-829","post","type-post","status-publish","format-standard","hentry","category-vllm","tag-dokploy","tag-grafana","tag-mlflow","tag-observability","tag-prometheus","tag-vllm","tag-768"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":7}},"_links":{"self":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/posts\/829","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/comments?post=829"}],"version-history":[{"count":1,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/posts\/829\/revisions"}],"predecessor-version":[{"id":830,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/posts\/829\/revisions\/830"}],"wp:attachment":[{"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/media?parent=829"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/categories?post=829"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.itsmygo.uk\/wordpress\/wp-json\/wp\/v2\/tags?post=829"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}