{
    "componentChunkName": "component---src-templates-issues-tsx",
    "path": "/issues/456",
    "result": {"data":{"issuesJson":{"id":"aaf54623-f7dd-595b-9be8-6fd68d83275d","title":"martin-helmich/prometheus-nginxlog-exporter: 解析 Nginx 日志，暴露成指标","number":456,"bodyHTML":"<div align=\"center\" dir=\"auto\">\n<p dir=\"auto\"><a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/a15b413168923d02e21292705ceaf86b92675f98e250c5c896a02ba7504a6eae/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f657279616a662f7475406d61696e2f696d672f696d6167655f32303234303432305f3231343430382e676966\"><img src=\"https://camo.githubusercontent.com/a15b413168923d02e21292705ceaf86b92675f98e250c5c896a02ba7504a6eae/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f657279616a662f7475406d61696e2f696d672f696d6167655f32303234303432305f3231343430382e676966\" width=\"100%\" height=\"3\" data-animated-image=\"\" data-canonical-src=\"https://cdn.jsdelivr.net/gh/eryajf/tu@main/img/image_20240420_214408.gif\" style=\"max-width: 100%; height: auto; max-height: 3px;\"></a><br><br></p>\n<markdown-accessiblity-table><table role=\"table\">\n<thead>\n<tr>\n<th align=\"right\">Repos</th>\n<th align=\"left\"><a href=\"https://github.com/martin-helmich/prometheus-nginxlog-exporter\">martin-helmich/prometheus-nginxlog-exporter</a></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td align=\"right\"><strong>Views</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/9bfe9962e6f56d11c8d4584438a86986fd436f77593ce003491bedd62972a8da/68747470733a2f2f76696577732e77686174696c656172656e65642e746f6461792f76696577732f6769746875622f6d617274696e2d68656c6d6963682f70726f6d6574686575732d6e67696e786c6f672d6578706f727465722e737667\" alt=\"views\" data-canonical-src=\"https://views.whatilearened.today/views/github/martin-helmich/prometheus-nginxlog-exporter.svg\" style=\"max-width: 100%;\"></a></td>\n</tr>\n<tr>\n<td align=\"right\"><strong>Stars</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/a2c07b8f990bdd3a0c1aae372e51cbf5fddc0a9f7fdf3e3dc3e8ed887b66c329/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6d617274696e2d68656c6d6963682f70726f6d6574686575732d6e67696e786c6f672d6578706f727465723f636f6c6f723d663266303864266c6f676f3d556e64657274616c65266c6f676f436f6c6f723d656234363330\" alt=\"stars\" data-canonical-src=\"https://img.shields.io/github/stars/martin-helmich/prometheus-nginxlog-exporter?color=f2f08d&amp;logo=Undertale&amp;logoColor=eb4630\" style=\"max-width: 100%;\"></a></td>\n</tr>\n<tr>\n<td align=\"right\"><strong>Forks</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/515be826732e6f652d15e4832e1a4f5f9429ee500463f66e61f6ae864faf2b32/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f666f726b732f6d617274696e2d68656c6d6963682f70726f6d6574686575732d6e67696e786c6f672d6578706f727465723f636f6c6f723d626138366562266c6f676f3d48616e647368616b65266c6f676f436f6c6f723d656136616136\" alt=\"forks\" data-canonical-src=\"https://img.shields.io/github/forks/martin-helmich/prometheus-nginxlog-exporter?color=ba86eb&amp;logo=Handshake&amp;logoColor=ea6aa6\" style=\"max-width: 100%;\"></a></td>\n</tr>\n<tr>\n<td align=\"right\"><strong>License</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/30dc6c9b8dd8ab42711ee0a50ad81926e6d99faef792d69fddb2dd86c148e541/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6d617274696e2d68656c6d6963682f70726f6d6574686575732d6e67696e786c6f672d6578706f727465723f6c6f676f3d64617461253341696d616765253246706e672533426261736536342532436956424f5277304b47676f414141414e53556845556741414144414141414177434159414141425841766d48414141414358424957584d41414173544141414c457745416d70775941414144336b6c45515652346e4f335953557a5555426748384a726f57567255474a66456d3773584e63534446784d544c327069347348456778654e526f77586770455742445552522532424e414e4f4b4f4b36366f6f4b4a4742586545475263574163455646475152484677516d483525324630774861655748493944554455354c356b6e6568644f62377a66652532423139636e434a47495243516945596c514237594a4979474c38616f73756c565a36695246516a69474b6b7564576735614c6c704f70704e586e665071773555304459524a6d56786a4367464633424c755a476d416f5655694b4541726d583744375553677351706f72674761336748664b34483663754262435644334771683141352532424c6745253242467749656e514d306a6f446f66714c6f48564e7742796d384370546e416d327a51713073676478624964515a556c416b7150415a3664676a303541446f59526f6f66792532466f5869726f376b3551586a4c6f70677a4b69514e6c4c4461716f4967754577426a7a7150355066446a45394479495879493633464d547751464d43567271774e61763451666f52673538514625324266724d485172454b3844546f434d714e4179574e4866786d54526f4c4f726d5352566747744466714345715a4f4851727a6f34706243557341333431365169364551394b476a6345465267484f724f4b6e5536574162396247455459656b4b7843766a546167394534706a653534446b3551503862624d4859762532464333756541654a6b50304f4778422532424a70426e4172595238455951516e6f4e31414e4661426e5050356c385372736559514c303641646b30464a5938484f5761424d6c6541486a683068506f73497a6c6f3876304125324633345a694f6548726130714b52504d5653493774762532423932747725324676687855654252713456454c674d376642714b354770526d6f514c584e7075625475367a6f4e52706754386e5051627138347764253246494375767978694b4871694e41664933774d367549684271476b4c696977414f734b44714f68743749747239567938536a52424557667941627225324668523142667056514664484a42253246423268683778376a36517077435665655951326b72554235436c636a3641326d3067576a25324244306d4c34397a573563517943484c4e37726a6c6d6d6174457958582532464372547a412532466f51785a6b576c39474a5443566f25324279546a3837253242346769504b6376307149486f344156344430565a727251493334706e70524d36357875652532467a417265453425324654253246536f676c664542794d7369517441546c4c3352414a355948725378365a44665337307337754d486842705225324659423573305057366f455270316236253246667252684b3353444c35546965364f515548516c5133735644752532427a50636b397657453973747225324236496a533967486d5750616861444a25324277434b364e494242587348423948796b587378774470686c436d416476706c6162554a4e6e5a504239342532464e7436784f6538587a4562503257684d335741673147756236744825324233513150673337365239713475716c6e6f36676448476a444f5139306562303141484d3672596975554a314f713472344656756a35765239427a4d3957674e764f7977446869495951467667626366774166774d764863615067425041253246447948476a50624e394138616d6562636477416444354e6633373574787165774e5552656f797677424958594c645170576c6877465771745061435044334173467541535636717171496c62304a766b564331464c39576b4c55556c55574b337a585a4c46432532423125324642726f46746f364f7358497545594a5034447a7a5732594656316f4a614141414141456c46546b5375516d4343\" alt=\"license\" data-canonical-src=\"https://img.shields.io/github/license/martin-helmich/prometheus-nginxlog-exporter?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAD3klEQVR4nO3YSUzUUBgH8JroWVrUGJfEm7sXNcSDFxMTL2pi4sHEgxeNRowXgpEWBDURR%2BNANOKOK66ooKJGBXeEGRcWAcEVFGQRHFwQmH5%2F0wHaeWHI9DUDU5L5knehdOb7zfe%2B19cnCJGIRCQiEYlQB7YJIyGL8aosulVZ6iRFQjiGKkudWg5aLlpOppNXnfPqw5U0DYRJmVxjCgFF3BLuZGmAoVUiKEArmX7D7USgsQporgGa3gHfK4H6cuBbCVD3Gqh1A5%2BLgE%2BFwIenQM0joDofqLoHVNwBym8CpTnAm2zQq0sgdxbIdQZUlAkqPAZ6dgj05ADoYRoofy%2FoXiro7k5QXjLopgzKiQNlLDaqoIguEwBjzqP5PfDjE9DyIXyI63FMTwQFMCVrqwNav4QfoRg58QF%2BfrMHQrEK8DToCMqNAyWNHfxmTRoLOrmSRVgGtDfqCEqZOHQrzo4pbCUsA3416Qi6EQ9KGjcEFRgHOrOKnU6WAb9bGETYekKxCvjTag9E4pje54Dk5QP8bbMHYv%2FC3ueAeJkP0OGxB%2BJpBnArYR8EYQQnoN1ANFaBnPP5l8SrseYQL06Adk0FJY8HOWaBMleAHjh0hPosIzlo8v0A%2F34ZiOeHra0qKRPMVSI7tv%2B92tw%2FvhxUeBRq4VELgM7fBqK5GpRmoQLXNpubTu6zoNRpgT8nPQbq84wd%2FICuvyxiKHqiNAfI3wM6uIhBqGkLiiwAOsKDqOht7Itr9Vy8SjRBEWfyAbr%2FhR1BfpVQFdHJB%2FB2hh7x7j6QpwCVeeYQ2krUB5Clcj6A2m0gWj%2BD0mL49zW5cQyCHLN7rjlmmatEyXX%2FCrTzA%2FoQxZkWl9GJTCVo%2ByTj87%2B4giPKcv0qIHo4AV4D0VZrrQI34pnpRM65xue%2FzAreE4%2FT%2FSoglfEByMsiQtATlL3RAJ5YHrSx6ZDfS70s7uMHhBpR%2FYB5s0PW6oERp1b6%2FfrRhK3SDL5Tie6OQUHQlQ3sVDu%2BzPck9vWE9str%2B6IjS9gHmWPahaDJ%2BwCK6NIBBXsHB9HykXsxwDphlCmAdvplabUJNnZPB94%2FNt6xOe8XzEbP2WhM3WAg1Gub6tH%2B3Q1Pg376R9q4uqlno6gdHGjDOQ90eb01AHM6rYiuUJ1Oq4r4FVuj5vR9BzM9WgNvOywDhiIYQFvgbcfwAfwMvHcaPgBPA%2FDyHGjPbN9A8amebcdwAdD5Nf375txqewNUReoyvwBIXYLdQpWlhwFWqtPaCPD3AsFuASV6qqqIlb0JvkVC1FL9WkLUUlUWK3zXZLFC%2B1%2FBroFto6OsXIuEYJP4DzzW2YFV1oJaAAAAAElFTkSuQmCC\" style=\"max-width: 100%;\"></a></td>\n</tr>\n<tr>\n<td align=\"right\"><strong>UpdatedAt</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/d2ba9d98275bbcff9d0b3ac8fd417654463be0b6e56cb31fd105629c661c59a8/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f6d617274696e2d68656c6d6963682f70726f6d6574686575732d6e67696e786c6f672d6578706f727465723f646973706c61795f74696d657374616d703d636f6d6d6974746572266c6f676f3d64617461253341696d616765253246706e672533426261736536342532436956424f5277304b47676f414141414e5355684555674141414234414141416543415941414141374d4b3669414141414358424957584d41414173544141414c457745416d7077594141414648556c45515652346e4c5658375539615678776d3236646c582532466468627825324232253246516e626b7655627264554151674a4a496655444e574454546d4f76314651554661504a346b7573725630314a7431734e70637453327533626f745a746d786439744a5346536f714b71494635625944464c436f76436c656673747a4a387758524c445a4c7a6e6b634f343535376e3364332532466e655a3472454f515a74315771462532423858467234253242664f4c4565326a6f59307a776638546f795a50766a45676b4c592532426b306d6d72584f36644b696e787a476b30666a5430782532425279723055716e6359637a4d317263347451253242497270324c4758646f344e4334567657715453373277716c632532427231334f527269364b6458646e624f484c6c776c7a4a70524b6e3657342532424b36706f4f434e6e494166486a253246253242776168495a4234764b6e715a6630714a704e49716c2532467638545530634e6c3572627963337730516e54703379324c54614a374d314e617844723266526e315370504736476961323174664533345463614f617931694d55564f5146624659714957536f31573854694156616e43306576584f4542375770313448466232327a453566714c4f433545524c515769644e614e49347545636339693768634a6c644868324e57725135674464624f6c7061756d49754c62326174415144506e7a3062384e6257636d785656524a33486d7870536377777a4f4a6d4b44524765384c6c435a444c4739673754496e5631516c376462586256316533675430574b697243466f6d6b5079767758466c5a474a4f6a563625324253743634757564445a4f55354555636f782532464d455144567674364d62634e3237593341797a687633737061557242365a3971724a534f3139657a6a387032704c426b4a792532426343484a7857493567573574636652527a31645531394766476b6f7539505a4f34736d52396a4746777065783444793362766e6d4b79706f74625531335669646a71595a68726a343972764d457425324625324659714c7a396430304e6a57253246637a67796f394f35317a7336614e6c6f354644747530445a675146686c47584a30644241446f4e6864367576703657686f617967374e394c564748386d443462253246486e667455516f4e4734764c51306769784d716c5725324234714f6a744e48446733723166365969525347785279375576714c62395534716b716e78504f4e7661356c447048723125324279794b524e4b57425a793565644d554842326d3572792532422532424551772532427a6766347a6f39253246306f634e3357527a4c4277344a2532424a7950574372716d4967475974554f735744346f785a46516f50556a4770564871493425324661666b51504336665a5165654d31253242764c7549516e6a754257514444437363726d485039656f4e5041744271664f6e5875614b25324268364a45624772732532427076764d6d78654962683836336162565065597953456f39464a48704e4d464a59253242503563575a6b6667374f3174537759436553514c54593345385130392532464256504a556c78516a7368543142736343593032723955445542667643484236367063665041336c794165336e6772332532463437584467614a7a736c7937787741364e5a746c555550437541487161536a5549502532427375653842525741432532464e6651374a5a505a35397330476a3756747049537a34685125324243706658474d4b685a63764c70554b7866574d386f68766637702532464f446a4842666356463849736b383267314648796b63564645253242555a414158343761452532464d6c34504f3530506e75683025324678346e6d637957507364774468427836436d6b4c562532466746446a594b784f4a4f4674623077517949684c39527943774b33414f664947703159464542686e4d4a634c525745624b644b516f55366e63545a6b494544696341792532463831645675454d3552775066657934784f7830496b25324649324e6e466b692532425761664f6f464959466367595a43797864376543556a626334416d46363566742532466b4d686b336f25324235686337734d4a79716a4a45477659466151464972375930775077384246415925324236253242766d6b3377367a7a5275444d6d5a5652736668385274413075455453443775434254364459514e36697665553066706b594c6a453671725672744f78654e4b553954484c5a4a396b4255324a427342685635416976422532466f4b61514e4b675043427744596149665a4334616454684f71463457454e56694c4a77566f586f62664c424b56773637414f6154734c6336355461564b32317651344c613939654b6359673576627873624f627a5451394e37554b4467554f3177446a6944494942736868357a746733396e514d4c535a4248344f7a424f55444551586d323036643366634c67737762585141345068634b336e6873775531427a3877765130395248472532466f597933656a6677424e6d746f59714c4130586741414141424a52553545726b4a676767253344253344266c6162656c3d557064617465644174\" alt=\"last-commit\" data-canonical-src=\"https://img.shields.io/github/last-commit/martin-helmich/prometheus-nginxlog-exporter?display_timestamp=committer&amp;logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFHUlEQVR4nLVX7U9aVxwm26dlX%2Fdhbx%2B2%2FQnbkvUbrdUAQgJJIfUDNWDTTmOv1FQUFaPJ4kusrV01Jt1sNpctS2u3botZtmxd9tJSFSoqKqIF5bYDFLCovClefstzJ8wXRLDZLznkcO4557n3d3%2FneZ4rEOQZt1WqF%2B8XFr4%2BfOLEe2joY0zwf8ToyZPvjEgkLY%2Bk0mmrXO6dKinxzGk0fjT0x%2BRyr0UqncYczM1rc4tQ%2BIrp2LGXdo4NC4VvWqTS72wqlc%2Br13ORri6KdXdnbOHLlwlzJpRKn6W4%2BK6poOCNnIAfHj%2F%2BwahIZB4vKnqZf0qJpNIql%2Fv8TU0cNl5rbyc3w0QnTp3y2LTaJ7M1NaxDr2fRn1SpPG6Gia21tfE34TcaOay1iMUVOQFbFYqIWSo1W8TiAVanC0evXOEB7Wp14HFb22zE5fqLOC5ERLQWidNaNI4uEcc9i7hcJldHh2NWrQ5gDdbOlpaumIuLb2atAQDPnz0b8NbWcmxVVRJ3HmxpScwwzOJmKDRGe8LlCZDLG9g7TInV1Ql7dbXbV1e3gT0WKirCFomkPyvwXFlZGJOjV6%2BSt64uudDZOU5EUcox%2FMEQDVvt6MbcN27Y3Ayzhv3spaUrB6Z9qrJSO19ezj8p2pLBkJy%2BcCHJxWI5gW5tcfRRz1dU19GfGkou9PZO4smR9jGFwpex4Dy3bvnmKypotbU13VidjqYZhrj49rvMEt%2F%2FYqLz9d00NjW%2Fczgyo9O51zs6aNlo5FDtu0DZgQFhlGXJ0dBADoNhd6uvp6Whoayg7N9LVGH8mD4b%2FHnftUQoNG4vLQ0gixMqlW%2B4qOjtNHDg3r1f6YiRSGxRy7UvqLb9U4qkqnxPONva5lDpHr1%2ByyKRNKWBZy5edMUHB2m5ry%2B%2BEQw%2Bzgf4zo9%2F0ocN3WRzLBw4J%2BJyPWCrqmIgGYtUOsWD4oxZFQoPUjGpVHqI4%2FafkQPC6fZQeeM1%2BvLuIQnjuBWQDDCscrmHP9eoNPAtBqfOnXuaK%2Bh6JEbGrs%2BpvvMmxeIbh863abVPeYySEo9FJHpNMFJY%2BP5cWZkfg7O1tSwYCeSQLTY3E8Q09%2FBVPJUlxQjshT1BscCY02r9UDUBfvCHB66pcfPA3lyAe3ngr3%2F47XDgaJzsly7xwA6NZtlUUPCuAHqaSjUIP%2Bsue8BRWAC%2FNfQ7JZPZ59s0Gj7VtpISz4hQ%2BCpfXGMKhZcvLpUKxfWM8ohvf7p%2FODjHBfcVF8Isk82g1FHykcVFE%2BUZAAX47aE%2FMl4PO50Pnuh0%2Fx4nmcyWPsdwDhBx6CmkLV%2FgFDjYKxOJOFtb0wQyIhL9RyCwK3AOfIGp1YFEBhnMJcLRWEbKdKQoU6ncTZkIEDicAy%2F81dVuEM5RwPfey4xOx0Ik%2FI2NnFki%2BWafOoFIYFcgYZCyxd7eCUjbc4AmF65ft%2FkMhk3o%2B5hc7sMJyqjJEGvYFaQFIr7Y0wPw8BFAY%2B6%2Bvmk3w6zzRuDMmZVRsfh8RtA0uETSD7uCBT6DYQN6iveU0fpkYLjE6qrVrtOxeNKU9THLZJ9kBU2JBsBhV5AivB%2FoKaQNKgPCBwDYaIfZC4adThOqF4WENViLJwVoXobfLBKVw67AOaTsLc65TaVK21vQ4La99eKcYg5vbxsbObzTQ9N7UKDgUO1wDjiDIIBshh5ztg39nQMLSZBH4OzBOUDEQXm206d3fcLgswbXQA4PhcK3nhswU1Bz8wvQ09RHG%2FoYy3ejfwBNmtoYqLA0XgAAAABJRU5ErkJggg%3D%3D&amp;label=UpdatedAt\" style=\"max-width: 100%;\"></a></td>\n</tr>\n<tr>\n<td align=\"right\"><strong>CreatedAt</strong></td>\n<td align=\"left\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/9e821222617e7234f663edd133b233455f3a575b03b07356de15507f9341cf7f/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f637265617465642d61742f6d617274696e2d68656c6d6963682f70726f6d6574686575732d6e67696e786c6f672d6578706f727465723f6c6f676f3d64617461253341696d616765253246706e672533426261736536342532436956424f5277304b47676f414141414e5355684555674141414234414141416543415941414141374d4b3669414141414358424957584d41414173544141414c457745416d7077594141414648556c45515652346e4c5658375539615678776d3236646c582532466468627825324232253246516e626b7655627264554151674a4a496655444e574454546d4f76314651554661504a346b7573725630314a7431734e70637453327533626f745a746d786439744a5346536f714b71494635625944464c436f76436c656673747a4a387758524c445a4c7a6e6b634f343535376e3364332532466e655a3472454f515a74315771462532423858467234253242664f4c4565326a6f59307a776638546f795a50766a45676b4c592532426b306d6d72584f36644b696e787a476b30666a5430782532425279723055716e6359637a4d317263347451253242497270324c4758646f344e4334567657715453373277716c632532427231334f527269364b6458646e624f484c6c776c7a4a70524b6e3657342532424b36706f4f434e6e494166486a253246253242776168495a4234764b6e715a6630714a704e49716c2532467638545530634e6c3572627963337730516e54703379324c54614a374d314e617844723266526e315370504736476961323174664533345463614f617931694d55564f5146624659714957536f31573854694156616e43306576584f4542375770313448466232327a453566714c4f433545524c515769644e614e49347545636339693768634a6c644868324e57725135674464624f6c7061756d49754c62326174415144506e7a3062384e6257636d785656524a33486d7870536377777a4f4a6d4b44524765384c6c435a444c4739673754496e5631516c376462586256316533675430574b697243466f6d6b5079767758466c5a474a4f6a563625324253743634757564445a4f55354555636f782532464d455144567674364d62634e3237593341797a687633737061557242365a3971724a534f3139657a6a387032704c426b4a792532426343484a7857493567573574636652527a31645531394766476b6f7539505a4f34736d52396a4746777065783444793362766e6d4b79706f74625531335669646a71595a68726a343972764d457425324625324659714c7a396430304e6a57253246637a67796f394f35317a7336614e6c6f354644747530445a675146686c47584a30644241446f4e6864367576703657686f617967374e394c564748386d443462253246486e667455516f4e4734764c51306769784d716c5725324234714f6a744e48446733723166365969525347785279375576714c62395534716b716e78504f4e7661356c447048723125324279794b524e4b57425a793565644d554842326d3572792532422532424551772532427a6766347a6f39253246306f634e3357527a4c4277344a2532424a7950574372716d4967475974554f735744346f785a46516f50556a4770564871493425324661666b51504336665a5165654d31253242764c7549516e6a754257514444437363726d485039656f4e5041744271664f6e5875614b25324268364a45624772732532427076764d6d78654962683836336162565065597953456f39464a48704e4d464a59253242503563575a6b6667374f3174537759436553514c54593345385130392532464256504a556c78516a7368543142736343593032723955445542667643484236367063665041336c794165336e6772332532463437584467614a7a736c7937787741364e5a746c555550437541487161536a5549502532427375653842525741432532464e6651374a5a505a35397330476a3756747049537a34685125324243706658474d4b685a63764c70554b7866574d386f68766637702532464f446a4842666356463849736b383267314648796b63564645253242555a414158343761452532464d6c34504f3530506e75683025324678346e6d637957507364774468427836436d6b4c562532466746446a594b784f4a4f4674623077517949684c39527943774b33414f664947703159464542686e4d4a634c525745624b644b516f55366e63545a6b494544696341792532463831645675454d3552775066657934784f7830496b25324649324e6e466b692532425761664f6f464959466367595a43797864376543556a626334416d46363566742532466b4d686b336f25324235686337734d4a79716a4a45477659466151464972375930775077384246415925324236253242766d6b3377367a7a5275444d6d5a5652736668385274413075455453443775434254364459514e36697665553066706b594c6a453671725672744f78654e4b553954484c5a4a396b4255324a427342685635416976422532466f4b61514e4b675043427744596149665a4334616454684f71463457454e56694c4a77566f586f62664c424b56773637414f6154734c6336355461564b32317651344c613939654b6359673576627873624f627a5451394e37554b4467554f3177446a6944494942736868357a746733396e514d4c535a4248344f7a424f55444551586d323036643366634c67737762585141345068634b336e6873775531427a3877765130395248472532466f597933656a6677424e6d746f59714c4130586741414141424a52553545726b4a676767253344253344266c6162656c3d437265617465644174\" alt=\"create-at\" data-canonical-src=\"https://img.shields.io/github/created-at/martin-helmich/prometheus-nginxlog-exporter?logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFHUlEQVR4nLVX7U9aVxwm26dlX%2Fdhbx%2B2%2FQnbkvUbrdUAQgJJIfUDNWDTTmOv1FQUFaPJ4kusrV01Jt1sNpctS2u3botZtmxd9tJSFSoqKqIF5bYDFLCovClefstzJ8wXRLDZLznkcO4557n3d3%2FneZ4rEOQZt1WqF%2B8XFr4%2BfOLEe2joY0zwf8ToyZPvjEgkLY%2Bk0mmrXO6dKinxzGk0fjT0x%2BRyr0UqncYczM1rc4tQ%2BIrp2LGXdo4NC4VvWqTS72wqlc%2Br13ORri6KdXdnbOHLlwlzJpRKn6W4%2BK6poOCNnIAfHj%2F%2BwahIZB4vKnqZf0qJpNIql%2Fv8TU0cNl5rbyc3w0QnTp3y2LTaJ7M1NaxDr2fRn1SpPG6Gia21tfE34TcaOay1iMUVOQFbFYqIWSo1W8TiAVanC0evXOEB7Wp14HFb22zE5fqLOC5ERLQWidNaNI4uEcc9i7hcJldHh2NWrQ5gDdbOlpaumIuLb2atAQDPnz0b8NbWcmxVVRJ3HmxpScwwzOJmKDRGe8LlCZDLG9g7TInV1Ql7dbXbV1e3gT0WKirCFomkPyvwXFlZGJOjV6%2BSt64uudDZOU5EUcox%2FMEQDVvt6MbcN27Y3Ayzhv3spaUrB6Z9qrJSO19ezj8p2pLBkJy%2BcCHJxWI5gW5tcfRRz1dU19GfGkou9PZO4smR9jGFwpex4Dy3bvnmKypotbU13VidjqYZhrj49rvMEt%2F%2FYqLz9d00NjW%2Fczgyo9O51zs6aNlo5FDtu0DZgQFhlGXJ0dBADoNhd6uvp6Whoayg7N9LVGH8mD4b%2FHnftUQoNG4vLQ0gixMqlW%2B4qOjtNHDg3r1f6YiRSGxRy7UvqLb9U4qkqnxPONva5lDpHr1%2ByyKRNKWBZy5edMUHB2m5ry%2B%2BEQw%2Bzgf4zo9%2F0ocN3WRzLBw4J%2BJyPWCrqmIgGYtUOsWD4oxZFQoPUjGpVHqI4%2FafkQPC6fZQeeM1%2BvLuIQnjuBWQDDCscrmHP9eoNPAtBqfOnXuaK%2Bh6JEbGrs%2BpvvMmxeIbh863abVPeYySEo9FJHpNMFJY%2BP5cWZkfg7O1tSwYCeSQLTY3E8Q09%2FBVPJUlxQjshT1BscCY02r9UDUBfvCHB66pcfPA3lyAe3ngr3%2F47XDgaJzsly7xwA6NZtlUUPCuAHqaSjUIP%2Bsue8BRWAC%2FNfQ7JZPZ59s0Gj7VtpISz4hQ%2BCpfXGMKhZcvLpUKxfWM8ohvf7p%2FODjHBfcVF8Isk82g1FHykcVFE%2BUZAAX47aE%2FMl4PO50Pnuh0%2Fx4nmcyWPsdwDhBx6CmkLV%2FgFDjYKxOJOFtb0wQyIhL9RyCwK3AOfIGp1YFEBhnMJcLRWEbKdKQoU6ncTZkIEDicAy%2F81dVuEM5RwPfey4xOx0Ik%2FI2NnFki%2BWafOoFIYFcgYZCyxd7eCUjbc4AmF65ft%2FkMhk3o%2B5hc7sMJyqjJEGvYFaQFIr7Y0wPw8BFAY%2B6%2Bvmk3w6zzRuDMmZVRsfh8RtA0uETSD7uCBT6DYQN6iveU0fpkYLjE6qrVrtOxeNKU9THLZJ9kBU2JBsBhV5AivB%2FoKaQNKgPCBwDYaIfZC4adThOqF4WENViLJwVoXobfLBKVw67AOaTsLc65TaVK21vQ4La99eKcYg5vbxsbObzTQ9N7UKDgUO1wDjiDIIBshh5ztg39nQMLSZBH4OzBOUDEQXm206d3fcLgswbXQA4PhcK3nhswU1Bz8wvQ09RHG%2FoYy3ejfwBNmtoYqLA0XgAAAABJRU5ErkJggg%3D%3D&amp;label=CreatedAt\" style=\"max-width: 100%;\"></a></td>\n</tr>\n</tbody>\n</table></markdown-accessiblity-table>\n<a href=\"https://github.com/opsre/awesome-ops\">\n</a><p dir=\"auto\"><a href=\"https://github.com/opsre/awesome-ops\"><img src=\"https://camo.githubusercontent.com/b964a36ea4078c39f603d46a29436371c7541a2f26e0228d7b21b9d9805b43d3/68747470733a2f2f736f6369616c6966792e6769742e63692f6f707372652f617765736f6d652d6f70732f696d6167653f6465736372697074696f6e3d3126666f6e743d42697474657226666f726b733d31266973737565733d31266c616e67756167653d31266c6f676f3d6874747073253341253246253246617661746172732e67697468756275736572636f6e74656e742e636f6d25324675253246313838353638303230266e616d653d31266f776e65723d31267061747465726e3d436972637569742b426f6172642670756c6c733d31267374617267617a6572733d31267468656d653d4c69676874\" alt=\"\" data-canonical-src=\"https://socialify.git.ci/opsre/awesome-ops/image?description=1&amp;font=Bitter&amp;forks=1&amp;issues=1&amp;language=1&amp;logo=https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F188568020&amp;name=1&amp;owner=1&amp;pattern=Circuit+Board&amp;pulls=1&amp;stargazers=1&amp;theme=Light\" style=\"max-width: 100%;\"></a></p>\n<a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://camo.githubusercontent.com/a15b413168923d02e21292705ceaf86b92675f98e250c5c896a02ba7504a6eae/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f657279616a662f7475406d61696e2f696d672f696d6167655f32303234303432305f3231343430382e676966\"><img src=\"https://camo.githubusercontent.com/a15b413168923d02e21292705ceaf86b92675f98e250c5c896a02ba7504a6eae/68747470733a2f2f63646e2e6a7364656c6976722e6e65742f67682f657279616a662f7475406d61696e2f696d672f696d6167655f32303234303432305f3231343430382e676966\" width=\"100%\" height=\"3\" data-animated-image=\"\" data-canonical-src=\"https://cdn.jsdelivr.net/gh/eryajf/tu@main/img/image_20240420_214408.gif\" style=\"max-width: 100%; height: auto; max-height: 3px;\"></a>\n</div>\n<p dir=\"auto\">= NGINX-to-Prometheus log file exporter<br>\n:tip-caption: 💡<br>\n:note-caption: ℹ️<br>\n:important-caption: ❗<br>\n:caution-caption: 🔥<br>\n:warning-caption: <g-emoji class=\"g-emoji\" alias=\"warning\">⚠️</g-emoji><br>\n:toc:<br>\n:toc-placement!:<br>\n:toc-title:</p>\n<p dir=\"auto\">image:<a href=\"https://img.shields.io/github/workflow/status/martin-helmich/prometheus-nginxlog-exporter/Compile%20&amp;%20Test%5BGitHub\" rel=\"nofollow\">https://img.shields.io/github/workflow/status/martin-helmich/prometheus-nginxlog-exporter/Compile%20&amp;%20Test[GitHub</a> Workflow Status]<br>\nimage:<a href=\"https://quay.io/repository/martinhelmich/prometheus-nginxlog-exporter/status%5Blink=%22https://quay.io/repository/martinhelmich/prometheus-nginxlog-exporter%22,Docker\" rel=\"nofollow\">https://quay.io/repository/martinhelmich/prometheus-nginxlog-exporter/status[link=\"https://quay.io/repository/martinhelmich/prometheus-nginxlog-exporter\",Docker</a> Repository on Quay]<br>\nimage:<a href=\"https://goreportcard.com/badge/github.com/martin-helmich/prometheus-nginxlog-exporter%5Blink=%22https://goreportcard.com/report/github.com/martin-helmich/prometheus-nginxlog-exporter\" rel=\"nofollow\">https://goreportcard.com/badge/github.com/martin-helmich/prometheus-nginxlog-exporter[link=\"https://goreportcard.com/report/github.com/martin-helmich/prometheus-nginxlog-exporter</a>\", Go Report Card]<br>\nimage:<a href=\"https://img.shields.io/github/license/martin-helmich/prometheus-nginxlog-exporter%5BGitHub%5D\" rel=\"nofollow\">https://img.shields.io/github/license/martin-helmich/prometheus-nginxlog-exporter[GitHub]</a><br>\nimage:<a href=\"https://img.shields.io/badge/donate-PayPal-yellow%5Blink=%22https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;hosted_button_id=SEARYHPVS9U5N&amp;source=url\" rel=\"nofollow\">https://img.shields.io/badge/donate-PayPal-yellow[link=\"https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;hosted_button_id=SEARYHPVS9U5N&amp;source=url</a>\", Donate]</p>\n<p dir=\"auto\">Helper tool that continuously reads an NGINX log file (or any kind of similar log file) and exports metrics to <a href=\"https://prometheus.io/%5BPrometheus%5D\" rel=\"nofollow\">https://prometheus.io/[Prometheus]</a>.</p>\n<p dir=\"auto\">[discrete]<br>\n== Contents</p>\n<p dir=\"auto\">toc::[]</p>\n<p dir=\"auto\">== Usage</p>\n<p dir=\"auto\">You can either use a simple configuration, using command-line flags, or create<br>\na configuration file with a more advanced configuration.</p>\n<p dir=\"auto\">Use the command-line:</p>\n<h2 dir=\"auto\">[source]</h2>\n<h2 dir=\"auto\">$ ./prometheus-nginxlog-exporter <br>\n-format=\"\" <br>\n-listen-port=4040 <br>\n-namespace=nginx <br>\n[PATHS-TO-LOGFILES...]</h2>\n<p dir=\"auto\">Use the configuration file:</p>\n<h2 dir=\"auto\">[source]</h2>\n<h2 dir=\"auto\">$ ./prometheus-nginxlog-exporter -config-file /path/to/config.hcl</h2>\n<p dir=\"auto\">You can verify your config file before deployment, which will exit with shell status indicating success:</p>\n<h2 dir=\"auto\">[source]</h2>\n<h2 dir=\"auto\">$ ./prometheus-nginxlog-exporter -config-file /path/to/config.hcl -verify-config</h2>\n<h2 dir=\"auto\">Installation</h2>\n<p dir=\"auto\">There are multiple ways to install this exporter.</p>\n<p dir=\"auto\">=== Docker</p>\n<p dir=\"auto\">Docker images for this exporter are available at the quay.io and pkg.github.com<br>\nregistries:</p>\n<ul dir=\"auto\">\n<li><code class=\"notranslate\">quay.io/martinhelmich/prometheus-nginxlog-exporter:v1</code></li>\n<li><code class=\"notranslate\">ghcr.io/martin-helmich/prometheus-nginxlog-exporter/exporter:v1</code></li>\n</ul>\n<p dir=\"auto\">Have a look at the <a href=\"https://github.com/martin-helmich/prometheus-nginxlog-exporter/releases%5Breleases\">https://github.com/martin-helmich/prometheus-nginxlog-exporter/releases[releases</a> page]<br>\nto see the available versions and how to pull their images. In general, I would<br>\nrecommend using the <code class=\"notranslate\">v1</code> tag instead of <code class=\"notranslate\">latest</code>.</p>\n<p dir=\"auto\">Run the exporter as follows (adjust paths like <code class=\"notranslate\">/path/to/logs</code> and<br>\n<code class=\"notranslate\">/path/to/config</code> to your own needs):</p>\n<h2 dir=\"auto\">[source]</h2>\n<h2 dir=\"auto\">$ docker run <br>\n--name nginx-exporter <br>\n-v /path/to/logs:/mnt/nginxlogs <br>\n-p 4040:4040 <br>\nquay.io/martinhelmich/prometheus-nginxlog-exporter <br>\nmnt/nginxlogs/access.log</h2>\n<p dir=\"auto\">Command-line flags and arguments can simply be appended to the <code class=\"notranslate\">docker run</code> command, for example to use a<br>\nconfiguration file:</p>\n<h2 dir=\"auto\">[source]</h2>\n<h2 dir=\"auto\">$ docker run <br>\n--name nginx-exporter <br>\n-p 4040:4040 <br>\n-v /path/to/logs:/mnt/nginxlogs <br>\n-v /path/to/config.hcl:/etc/prometheus-nginxlog-exporter.hcl <br>\nquay.io/martinhelmich/prometheus-nginxlog-exporter <br>\n-config-file /etc/prometheus-nginxlog-exporter.hcl</h2>\n<p dir=\"auto\">=== DEB and RPM packages</p>\n<p dir=\"auto\">Each <a href=\"https://github.com/martin-helmich/prometheus-nginxlog-exporter/releases%5Brelease%5D\">https://github.com/martin-helmich/prometheus-nginxlog-exporter/releases[release]</a><br>\nfrom 1.5.1 or newer provides both DEB and RPM packages.</p>\n<p dir=\"auto\">DEB:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"$ wget https://github.com/martin-helmich/prometheus-nginxlog-exporter/releases/download/v1.9.2/prometheus-nginxlog-exporter_1.9.2_linux_amd64.deb\n$ apt install ./prometheus-nginxlog-exporter_1.9.2_linux_amd64.deb\"><pre class=\"notranslate\"><code class=\"notranslate\">$ wget https://github.com/martin-helmich/prometheus-nginxlog-exporter/releases/download/v1.9.2/prometheus-nginxlog-exporter_1.9.2_linux_amd64.deb\n$ apt install ./prometheus-nginxlog-exporter_1.9.2_linux_amd64.deb\n</code></pre></div>\n<p dir=\"auto\">RPM:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"$ wget https://github.com/martin-helmich/prometheus-nginxlog-exporter/releases/download/v1.9.2/prometheus-nginxlog-exporter_1.9.2_linux_amd64.rpm\n$ yum localinstall prometheus-nginxlog-exporter_1.9.2_linux_amd64.rpm\"><pre class=\"notranslate\"><code class=\"notranslate\">$ wget https://github.com/martin-helmich/prometheus-nginxlog-exporter/releases/download/v1.9.2/prometheus-nginxlog-exporter_1.9.2_linux_amd64.rpm\n$ yum localinstall prometheus-nginxlog-exporter_1.9.2_linux_amd64.rpm\n</code></pre></div>\n<p dir=\"auto\">The package come with a dependency on systemd and configure the exporter to be<br>\nrunning automatically:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"$ systemctl status prometheus-nginxlog-exporter\n$ # systemctl disable prometheus-nginxlog-exporter\n$ # systemctl enable prometheus-nginxlog-exporter\"><pre class=\"notranslate\"><code class=\"notranslate\">$ systemctl status prometheus-nginxlog-exporter\n$ # systemctl disable prometheus-nginxlog-exporter\n$ # systemctl enable prometheus-nginxlog-exporter\n</code></pre></div>\n<p dir=\"auto\">The packages drop a configuration file to <code class=\"notranslate\">/etc/prometheus-nginxlog-exporter.hcl</code><br>\nwhich you can adjust to your own needs.</p>\n<h3 dir=\"auto\">Manual installation, with systemd</h3>\n<p dir=\"auto\">If you do not want to use one of the pre-built packages, you can download the<br>\nbinary itself and manually configure systemd to start it. You can find an<br>\nexample unit file for this service<br>\n<a href=\"https://github.com/martin-helmich/prometheus-nginxlog-exporter/blob/master/res/package/prometheus-nginxlog-exporter.service%5Bin\">https://github.com/martin-helmich/prometheus-nginxlog-exporter/blob/master/res/package/prometheus-nginxlog-exporter.service[in</a> this repository].<br>\nSimply copy the unit file to <code class=\"notranslate\">/etc/systemd/system</code>:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"$ wget -O /etc/systemd/system/prometheus-nginxlog-exporter.service https://raw.githubusercontent.com/martin-helmich/prometheus-nginxlog-exporter/master/res/package/prometheus-nginxlog-exporter.service\n$ systemctl enable prometheus-nginxlog-exporter\n$ systemctl start prometheus-nginxlog-exporter\"><pre class=\"notranslate\"><code class=\"notranslate\">$ wget -O /etc/systemd/system/prometheus-nginxlog-exporter.service https://raw.githubusercontent.com/martin-helmich/prometheus-nginxlog-exporter/master/res/package/prometheus-nginxlog-exporter.service\n$ systemctl enable prometheus-nginxlog-exporter\n$ systemctl start prometheus-nginxlog-exporter\n</code></pre></div>\n<p dir=\"auto\">The shipped unit file expects the binary to be located in<br>\n<code class=\"notranslate\">/usr/sbin/prometheus-nginxlog-exporter</code> (if you sideload the exporter without<br>\nusing your package manager, you might want to put it to <code class=\"notranslate\">/usr/local</code>, instead)<br>\nand the configuration file in <code class=\"notranslate\">/etc/prometheus-nginxlog-exporter.hcl</code>. Adjust<br>\nto your own needs.</p>\n<h3 dir=\"auto\">Kubernetes</h3>\n<p dir=\"auto\">If you run a logfile-generating service (be it NGINX, or anything that generates<br>\nsimilar access log files) in Kubernetes, you can run the exporter as a sidecar<br>\nalong your \"main\" container within the same pod.</p>\n<p dir=\"auto\">The following example shows you how to deploy the exporter as a sidecar,<br>\naccepting logs from the main container via syslog:</p>\n<h2 dir=\"auto\">[source,yaml]</h2>\n<h2 dir=\"auto\">apiVersion: v1<br>\nkind: Pod<br>\nmetadata:<br>\nname: nginx-example<br>\nannotations:<br>\nprometheus.io/scrape: \"true\"<br>\nprometheus.io/port: \"4040\"<br>\nspec:<br>\ncontainers:<br>\n- name: web<br>\nimage: nginx<br>\n# ...<br>\n- name: exporter<br>\nimage: docker.pkg.github.com/martin-helmich/prometheus-nginxlog-exporter/exporter:v1<br>\nargs: [\"-config-file\", \"/etc/prometheus-nginxlog-exporter/config.hcl\"]<br>\nvolumeMounts:<br>\n- name: exporter-config<br>\nmountPath: /etc/prometheus-nginxlog-exporter<br>\nvolumes:<br>\n- name: exporter-config<br>\nconfigMap:<br>\nname: exporter-config</h2>\n<p dir=\"auto\">In this example, the configuration file is passed via the <code class=\"notranslate\">exporter-config</code><br>\nConfigMap. This might look like follows:</p>\n<h2 dir=\"auto\">[source,yaml]</h2>\n<p dir=\"auto\">apiVersion: v1<br>\nkind: ConfigMap<br>\nmetadata:<br>\nname: exporter-config<br>\ndata:<br>\nconfig.hcl: |<br>\nlisten {<br>\nport = 4040<br>\n}</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"namespace &quot;nginx&quot; {\n  source = {\n    syslog {\n      listen_address = &quot;udp://127.0.0.1:5531&quot;\n      format = &quot;rfc3164&quot;\n    }\n  }\n\n  format = &quot;$remote_addr - $remote_user [$time_local] \\&quot;$request\\&quot; $status $body_bytes_sent \\&quot;$http_referer\\&quot; \\&quot;$http_user_agent\\&quot; \\&quot;$http_x_forwarded_for\\&quot;&quot;\n\n  labels {\n    app = &quot;default&quot;\n  }\n}\"><pre class=\"notranslate\"><code class=\"notranslate\">namespace \"nginx\" {\n  source = {\n    syslog {\n      listen_address = \"udp://127.0.0.1:5531\"\n      format = \"rfc3164\"\n    }\n  }\n\n  format = \"$remote_addr - $remote_user [$time_local] \\\"$request\\\" $status $body_bytes_sent \\\"$http_referer\\\" \\\"$http_user_agent\\\" \\\"$http_x_forwarded_for\\\"\"\n\n  labels {\n    app = \"default\"\n  }\n}\n</code></pre></div>\n<hr>\n<p dir=\"auto\">The config file instructs the exporter to accept log input via syslog. To<br>\nforward logs to the exporter, just instruct your main container to send its<br>\naccess logs via syslog to <code class=\"notranslate\">127.0.0.1:5531</code> (which works, since the main<br>\ncontainer and the sidecar share their network namespace).</p>\n<h3 dir=\"auto\">Build from source</h3>\n<p dir=\"auto\">To build the exporter from source, simply build it with <code class=\"notranslate\">go get</code>:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"$ go get github.com/martin-helmich/prometheus-nginxlog-exporter\"><pre class=\"notranslate\"><code class=\"notranslate\">$ go get github.com/martin-helmich/prometheus-nginxlog-exporter\n</code></pre></div>\n<p dir=\"auto\">Alternatively, clone this repository and just run <code class=\"notranslate\">go build</code>:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"$ git clone https://github.com/martin-helmich/prometheus-nginxlog-exporter.git\n$ cd prometheus-nginxlog-exporter\n$ go build\"><pre class=\"notranslate\"><code class=\"notranslate\">$ git clone https://github.com/martin-helmich/prometheus-nginxlog-exporter.git\n$ cd prometheus-nginxlog-exporter\n$ go build\n</code></pre></div>\n<p dir=\"auto\">== Collected metrics</p>\n<p dir=\"auto\">This exporter collects the following metrics. This collector can listen on<br>\nmultiple log files at once and publish metrics in different namespaces. Each<br>\nmetric uses the labels <code class=\"notranslate\">method</code> (containing the HTTP request method) and<br>\n<code class=\"notranslate\">status</code> (containing the HTTP status code).</p>\n<h1 dir=\"auto\">[IMPORTANT]</h1>\n<h1 dir=\"auto\">Keep in mind that some of these metrics will require certain values to be present<br>\nin your access log format (for example, the <code class=\"notranslate\">http_upstream_time_seconds</code> metric<br>\nwill require your access to contain the variable <code class=\"notranslate\">$upstream_response_time</code>.</h1>\n<p dir=\"auto\">Metrics are exported at the <code class=\"notranslate\">/metrics</code> path.</p>\n<p dir=\"auto\">These metrics are exported:</p>\n<p dir=\"auto\">|===<br>\n| <code class=\"notranslate\">&lt;namespace&gt;_http_response_count_total</code> | The total amount of processed HTTP requests/responses.<br>\n| <code class=\"notranslate\">&lt;namespace&gt;_http_response_size_bytes</code> | The total amount of transferred content in bytes.<br>\n| <code class=\"notranslate\">&lt;namespace&gt;_http_request_size_bytes</code> | The total amount of received traffic in bytes. This metrics requires the <code class=\"notranslate\">$request_length</code> variable in the log format.<br>\n| <code class=\"notranslate\">&lt;namespace&gt;_http_upstream_time_seconds</code> | A summary vector of the upstream response times in seconds. Logging these needs to be specifically enabled in NGINX using the <code class=\"notranslate\">$upstream_response_time</code> variable in the log format.<br>\n| <code class=\"notranslate\">&lt;namespace&gt;_http_upstream_time_seconds_hist</code> | Same as <code class=\"notranslate\">&lt;namespace&gt;_http_upstream_time_seconds</code>, but as a histogram vector. Also requires the <code class=\"notranslate\">$upstream_response_time</code> variable in the log format.<br>\n| <code class=\"notranslate\">&lt;namespace&gt;_http_response_time_seconds</code> | A summary vector of the total response times in seconds. Logging these needs to be specifically enabled in NGINX using the <code class=\"notranslate\">$request_time</code> variable in the log format.<br>\n| <code class=\"notranslate\">&lt;namespace&gt;_http_response_time_seconds_hist</code> | Same as <code class=\"notranslate\">&lt;namespace&gt;_http_response_time_seconds</code>, but as a histogram vector. Also requires the <code class=\"notranslate\">$request_time</code> variable in the log format.<br>\n|===</p>\n<p dir=\"auto\">Additional labels can be configured in the configuration file (see below).</p>\n<p dir=\"auto\"><code class=\"notranslate\">&lt;namespace&gt;</code> can be omitted or overridden - see &lt;&gt; for<br>\nmore information.</p>\n<p dir=\"auto\">== Configuration file</p>\n<p dir=\"auto\">You can specify a configuration file to read at startup. The configuration file<br>\nis expected to be either in <a href=\"https://github.com/hashicorp/hcl%5BHCL%5D\">https://github.com/hashicorp/hcl[HCL]</a> or YAML format. Here's an example file:</p>\n<h2 dir=\"auto\">[source,hcl]</h2>\n<p dir=\"auto\">listen {<br>\nport = 4040<br>\naddress = \"10.1.2.3\"<br>\nmetrics_endpoint = \"/metrics\"<br>\n}</p>\n<p dir=\"auto\">consul {<br>\nenable = true<br>\naddress = \"localhost:8500\"<br>\ndatacenter = \"dc1\"<br>\nscheme = \"http\"<br>\ntoken = \"\"<br>\nservice {<br>\nid = \"nginx-exporter\"<br>\nname = \"nginx-exporter\"<br>\naddress = \"192.168.3.1\"<br>\ntags = [\"foo\", \"bar\"]<br>\n}<br>\n}</p>\n<p dir=\"auto\">namespace \"app1\" {<br>\nformat = \"$remote_addr - $remote_user [$time_local] \"$request\" $status $body_bytes_sent \"$http_referer\" \"$http_user_agent\" \"$http_x_forwarded_for\"\"<br>\nsource {<br>\nfiles = [<br>\n\"/var/log/nginx/app1/access.log\"<br>\n]<br>\n}</p>\n<h1 dir=\"auto\">log can be printed to std out, e.g. for debugging purposes (disabled by default)</h1>\n<p dir=\"auto\">print_log = false</p>\n<h1 dir=\"auto\">metrics_override = { prefix = \"myprefix\" }</h1>\n<h1 dir=\"auto\">namespace_label = \"vhost\"</h1>\n<p dir=\"auto\">labels {<br>\napp = \"application-one\"<br>\nenvironment = \"production\"<br>\nfoo = \"bar\"<br>\n}</p>\n<p dir=\"auto\">histogram_buckets = [.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10]<br>\n}</p>\n<h2 dir=\"auto\">namespace \"app2\" {<br>\nformat = \"$remote_addr - $remote_user [$time_local] \"$request\" $status $body_bytes_sent \"$http_referer\" \"$http_user_agent\" \"$http_x_forwarded_for\" $upstream_response_time\"<br>\nsource {<br>\nfiles = [<br>\n\"/var/log/nginx/app2/access.log\"<br>\n]<br>\n}<br>\n}</h2>\n<p dir=\"auto\">The same file as YAML file:</p>\n<h2 dir=\"auto\">[source,yaml]</h2>\n<p dir=\"auto\">listen:<br>\nport: 4040<br>\naddress: \"10.1.2.3\"<br>\nmetrics_endpoint: \"/metrics\"</p>\n<p dir=\"auto\">consul:<br>\nenable: true<br>\naddress: \"localhost:8500\"<br>\ndatacenter: dc1<br>\nscheme: http<br>\ntoken: \"\"<br>\nservice:<br>\nid: \"nginx-exporter\"<br>\nname: \"nginx-exporter\"<br>\naddress = \"192.168.3.1\"<br>\ntags: [\"foo\", \"bar\"]</p>\n<p dir=\"auto\">namespaces:</p>\n<ul dir=\"auto\">\n<li>name: app1<br>\nformat: \"$remote_addr - $remote_user [$time_local] \"$request\" $status $body_bytes_sent \"$http_referer\" \"$http_user_agent\" \"$http_x_forwarded_for\"\"<br>\nsource:<br>\nfiles:<br>\n- /var/log/nginx/app1/access.log\n<h1 dir=\"auto\">metrics_override:</h1>\n<h1 dir=\"auto\">prefix: \"myprefix\"</h1>\n<h1 dir=\"auto\">namespace_label: \"vhost\"</h1>\nlabels:<br>\napp: \"application-one\"<br>\nenvironment: \"production\"<br>\nfoo: \"bar\"<br>\nhistogram_buckets: [.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10]</li>\n<li>name: app2<br>\nformat: \"$remote_addr - $remote_user [$time_local] \"$request\" $status $body_bytes_sent \"$http_referer\" \"$http_user_agent\" \"$http_x_forwarded_for\" $upstream_response_time\"<br>\nsource:<br>\nfiles:<br>\n- /var/log/nginx/app2/access.log</li>\n</ul>\n<hr>\n<h2 dir=\"auto\">Advanced features</h2>\n<h3 dir=\"auto\">Namespace as labels</h3>\n<p dir=\"auto\">For historic reasons, this exporter exports separate metrics for different<br>\nnamespaces (because the namespace is part of the metric name). However, in many<br>\n(most) cases, it's more convenient to have the same metric name across different<br>\nnamespaces (with different log formats and names).</p>\n<p dir=\"auto\">This can be done in two steps:</p>\n<ol dir=\"auto\">\n<li>Override Prometheus metrics namespace to some common prefix (<code class=\"notranslate\">metrics_override</code>)</li>\n<li>Set label name for nginxlog-exporter's config namespace (<code class=\"notranslate\">namespace_label</code>)</li>\n</ol>\n<h2 dir=\"auto\">[source,hcl]</h2>\n<p dir=\"auto\">namespace \"app1\" {<br>\n...<br>\nmetrics_override = { prefix = \"myprefix\" }<br>\nnamespace_label = \"vhost\"<br>\n...<br>\n}</p>\n<h2 dir=\"auto\">namespace \"app2\" {<br>\n...<br>\nmetrics_override = { prefix = \"myprefix\" }<br>\nnamespace_label = \"vhost\"<br>\n...<br>\n}</h2>\n<h2 dir=\"auto\">Exported metrics will have the following format:<br>\n[source]</h2>\n<h2 dir=\"auto\">myprefix_http_response_count_total{vhost=\"app1\", ...}<br>\nmyprefix_http_response_count_total{vhost=\"app2\", ...}<br>\n...</h2>\n<ul dir=\"auto\">\n<li><code class=\"notranslate\">prefix</code> can be set to <code class=\"notranslate\">\"\"</code>, resulting metrics like <code class=\"notranslate\">http_response_count_total{...}</code></li>\n<li><code class=\"notranslate\">namespace_label</code> can be omitted - so you have full control on metric format</li>\n</ul>\n<p dir=\"auto\">Some details and history on this can be found in <a href=\"https://github.com/martin-helmich/prometheus-nginxlog-exporter/issues/13%5Bissue\" data-hovercard-type=\"issue\" data-hovercard-url=\"/martin-helmich/prometheus-nginxlog-exporter/issues/13/hovercard\">https://github.com/martin-helmich/prometheus-nginxlog-exporter/issues/13[issue</a> <a class=\"issue-link js-issue-link\" data-error-text=\"Failed to load title\" data-id=\"3080708478\" data-permission-text=\"Title is private\" data-url=\"https://github.com/awesome-ops/awesome-ops.github.io/issues/13\" data-hovercard-type=\"issue\" data-hovercard-url=\"/awesome-ops/awesome-ops.github.io/issues/13/hovercard\" href=\"https://github.com/awesome-ops/awesome-ops.github.io/issues/13\">#13</a>].</p>\n<h3 dir=\"auto\">Custom labels pass-through</h3>\n<p dir=\"auto\">Partial case of &lt;&gt;:</p>\n<h2 dir=\"auto\">[source,hcl]</h2>\n<h2 dir=\"auto\">namespace \"app1\" {<br>\nformat = \"$remote_addr - $remote_user [$time_local] ... \"$geoip_country_code\" $upstream_addr\"<br>\n...<br>\nrelabel \"upstream_addr\" { from = \"upstream_addr\" }<br>\nrelabel \"country\" { from = \"geoip_country_code\" }<br>\n...<br>\n}</h2>\n<p dir=\"auto\">Exported metrics will have <code class=\"notranslate\">upstream_addr</code> and <code class=\"notranslate\">country</code> labels.</p>\n<h3 dir=\"auto\">Log sources</h3>\n<p dir=\"auto\">Currently, the exporter supports reading log data from</p>\n<ol dir=\"auto\">\n<li>files</li>\n<li>syslog</li>\n</ol>\n<p dir=\"auto\">All log sources can be configured on a per-namespace basis using the <code class=\"notranslate\">source</code> property.</p>\n<h4 dir=\"auto\">Reading from files</h4>\n<p dir=\"auto\">When reading from log files, all that is needed is a <code class=\"notranslate\">files</code> property:</p>\n<div class=\"highlight highlight-source-hcl notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"namespace &quot;test&quot; {\n  source {\n    files = [&quot;/var/log/nginx/access.log&quot;]\n    // ...\n  }\n}\"><pre class=\"notranslate\"><span class=\"pl-en\">namespace</span> <span class=\"pl-smi\">\"test\"</span> {\n  <span class=\"pl-en\">source</span> {\n    <span class=\"pl-v\"><span class=\"pl-smi\">files</span> <span class=\"pl-k\">=</span> </span>[<span class=\"pl-s\"><span class=\"pl-pds\">\"</span>/var/log/nginx/access.log<span class=\"pl-pds\">\"</span></span>]\n    <span class=\"pl-c\"><span class=\"pl-c\">//</span> ...<span class=\"pl-c\"></span></span>\n  }\n}</pre></div>\n<h4 dir=\"auto\">Reading from syslog</h4>\n<p dir=\"auto\">The exporter can also open and listen on a Syslog port and read logs from there. Configuration works as follows:</p>\n<h2 dir=\"auto\">[source,hcl]</h2>\n<p dir=\"auto\">namespace \"test\" {<br>\nsource {<br>\nsyslog {<br>\nlisten_address = \"udp://127.0.0.1:8514\" &lt;1&gt;<br>\nformat = \"rfc3164\" &lt;2&gt;<br>\ntags = [\"nginx\"] &lt;3&gt;<br>\n}</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"// ...\"><pre class=\"notranslate\"><code class=\"notranslate\">// ...\n</code></pre></div>\n<h2 dir=\"auto\">}<br>\n}</h2>\n<p dir=\"auto\">&lt;1&gt; The <code class=\"notranslate\">listen_address</code> might be either a TCP or UDP address. UNIX sockets are not supported (yet -- pull requests are welcome)<br>\n&lt;2&gt; The <code class=\"notranslate\">format</code> may be one of <code class=\"notranslate\">rfc3164</code>, <code class=\"notranslate\">rfc5424</code>, <code class=\"notranslate\">rfc6587</code> or <code class=\"notranslate\">auto</code>. If omitted, it will default to <code class=\"notranslate\">auto</code><br>\n&lt;3&gt; The <code class=\"notranslate\">tags</code> must be specified.</p>\n<p dir=\"auto\">Have a look at <a href=\"http://nginx.org/en/docs/syslog.html%5Bthe\" rel=\"nofollow\">http://nginx.org/en/docs/syslog.html[the</a> respective section of the NGINX documentation] on how to set up NGINX to log into syslog.</p>\n<h3 dir=\"auto\">Dynamic re-labeling</h3>\n<p dir=\"auto\">Re-labeling lets you add arbitrary fields from the parsed log line as labels to your metrics.<br>\nTo add a dynamic label, add a <code class=\"notranslate\">relabel</code> statement to your configuration file:</p>\n<h2 dir=\"auto\">[source,hcl]</h2>\n<p dir=\"auto\">namespace \"app-1\" {<br>\n// ...</p>\n<h2 dir=\"auto\">relabel \"host\" {<br>\nfrom = \"server_name\"<br>\nwhitelist = [ &lt;1&gt;<br>\n\"host-a.com\",<br>\n\"host-b.de\"<br>\n]<br>\n}<br>\n}</h2>\n<p dir=\"auto\">&lt;1&gt; The <code class=\"notranslate\">whitelist</code> property is optional; if set, only the supplied values will be added as label.<br>\nAll other values will be subsumed under the <code class=\"notranslate\">\"other\"</code> label value. See <a class=\"issue-link js-issue-link\" data-error-text=\"Failed to load title\" data-id=\"3080708902\" data-permission-text=\"Title is private\" data-url=\"https://github.com/awesome-ops/awesome-ops.github.io/issues/16\" data-hovercard-type=\"issue\" data-hovercard-url=\"/awesome-ops/awesome-ops.github.io/issues/16/hovercard\" href=\"https://github.com/awesome-ops/awesome-ops.github.io/issues/16\">#16</a> for a more detailed<br>\ndiscussion around the reasoning.</p>\n<p dir=\"auto\">Dynamic relabeling also allows you to aggregate your metrics by request path (which replaces<br>\nthe experimental feature originally introduced in <a class=\"issue-link js-issue-link\" data-error-text=\"Failed to load title\" data-id=\"3080709885\" data-permission-text=\"Title is private\" data-url=\"https://github.com/awesome-ops/awesome-ops.github.io/issues/23\" data-hovercard-type=\"issue\" data-hovercard-url=\"/awesome-ops/awesome-ops.github.io/issues/23/hovercard\" href=\"https://github.com/awesome-ops/awesome-ops.github.io/issues/23\">#23</a>). The following example splits the content of<br>\nthe <code class=\"notranslate\">request</code> variable at every space (using <code class=\"notranslate\">split</code>) and return the second element (index 1) of the<br>\nresulting list which is the base for the regex):</p>\n<h2 dir=\"auto\">[source,hcl]</h2>\n<p dir=\"auto\">namespace \"app1\" {<br>\n// ...</p>\n<p dir=\"auto\">relabel \"request_uri\" {<br>\nfrom = \"request\"<br>\nsplit = 2<br>\nseparator = \" \" // &lt;1&gt;</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"// if enabled, only include label in response count metric (default is false)\nonly_counter = false\n\nmatch &quot;^/users/[0-9]+&quot; {\n  replacement = &quot;/users/:id&quot;\n}\n\nmatch &quot;^/profile&quot; {\n  replacement = &quot;/profile&quot;\n}\"><pre class=\"notranslate\"><code class=\"notranslate\">// if enabled, only include label in response count metric (default is false)\nonly_counter = false\n\nmatch \"^/users/[0-9]+\" {\n  replacement = \"/users/:id\"\n}\n\nmatch \"^/profile\" {\n  replacement = \"/profile\"\n}\n</code></pre></div>\n<h2 dir=\"auto\">}<br>\n}</h2>\n<p dir=\"auto\">&lt;1&gt; The <code class=\"notranslate\">separator</code> property is optional; if omitted, the space character (<code class=\"notranslate\">\" \"</code>) will be assumed as separator.</p>\n<p dir=\"auto\">If a match is found, the <code class=\"notranslate\">replacement</code> replaces each occurrence of the corresponding match in the original value. Otherwise the processing continues to check the following match statements.</p>\n<p dir=\"auto\">The YAML configuration for relabelings works similar to the HCL configuration:</p>\n<h2 dir=\"auto\">[source,yaml]</h2>\n<p dir=\"auto\">namespaces:</p>\n<ul dir=\"auto\">\n<li>name: app1<br>\nrelabel_configs:\n<ul dir=\"auto\">\n<li>target_label: request_uri<br>\nfrom: request<br>\nsplit: 2<br>\nseparator: ' '<br>\nmatches:\n<ul dir=\"auto\">\n<li>regexp: \"^/users/[0-9]+\"<br>\nreplacement: \"/users/:id\"</li>\n</ul>\n</li>\n</ul>\n</li>\n</ul>\n<hr>\n<p dir=\"auto\">If your regular expression contains groups, you can also use the matched values of those in the <code class=\"notranslate\">replacement</code> value:</p>\n<h2 dir=\"auto\">[source,hcl]</h2>\n<p dir=\"auto\">relabel \"request_uri\" {<br>\nfrom = \"request\"<br>\nsplit = 2</p>\n<h2 dir=\"auto\">match \"^/(users|profiles)/[0-9]+\" {<br>\nreplacement = \"/$1/:id\"<br>\n}<br>\n}</h2>\n<h3 dir=\"auto\">File Globs</h3>\n<p dir=\"auto\">You can specify one or more wildcards in the source file names, in which case the wildcards will be resolved to the corresponding list of files at startup of the exporter.</p>\n<p dir=\"auto\">Be aware that the list of matches is only evaluated at the start of the program. If a new file is added with a match of one glob filter, you'll have to restart the program for it to be monitored.</p>\n<p dir=\"auto\">Given a config like this:</p>\n<h2 dir=\"auto\">[source,hcl]</h2>\n<h2 dir=\"auto\">namespace \"test\" {<br>\nsource {<br>\nfiles = [\"/var/log/nginx/*_access.log\"]<br>\n// ...<br>\n}<br>\n}</h2>\n<p dir=\"auto\">And a folder containing these files:</p>\n<div class=\"highlight highlight-source-shell notranslate position-relative overflow-auto\" dir=\"auto\" data-snippet-clipboard-copy-content=\"# /var/log/nginx\nmain_access.log\nmain_error.log\nvirtualhost1_access.log\nvirtualhost1_error.log\"><pre class=\"notranslate\"><span class=\"pl-c\"><span class=\"pl-c\">#</span> /var/log/nginx</span>\nmain_access.log\nmain_error.log\nvirtualhost1_access.log\nvirtualhost1_error.log</pre></div>\n<p dir=\"auto\">The list of files monitored by this namespace will be <code class=\"notranslate\">/var/log/nginx/main_access.log,/var/log/nginx/virtualhost1_access.log</code>.</p>\n<h3 dir=\"auto\">JSON log_format</h3>\n<p dir=\"auto\">You can use the JSON parser by setting the <code class=\"notranslate\">--parser</code> command line flag or <code class=\"notranslate\">parser</code> config file property to <code class=\"notranslate\">json</code>.</p>\n<p dir=\"auto\">== Frequently Asked Questions</p>\n<blockquote>\n<p dir=\"auto\">I have started the exporter, but it is not exporting any application-specific metrics!</p>\n</blockquote>\n<p dir=\"auto\">This may have several issues:</p>\n<ol dir=\"auto\">\n<li>Make sure that the access log files that your exporter is listening on are present. The exporter will exit with an error code if a file is present but cannot be opened (for example, due to bad permissions), but will <em>wait</em> for a file if it does not yet exist.</li>\n<li>Make sure that the exporter can parse the lines from your access log files. Pay attention to the <code class=\"notranslate\">&lt;namespace&gt;_parse_errors_total</code> metric, which will indicate how many log lines could not be parsed.</li>\n</ol>\n<blockquote>\n<p dir=\"auto\">The exporter exports the <code class=\"notranslate\">&lt;namespace&gt;_http_response_count_total</code> metric, but not <em>[other metric that is mentioned in the README]</em>!</p>\n</blockquote>\n<p dir=\"auto\">Most metrics require certain values to be present in the access log files that are not present in the NGINX default configuration. Especially, make sure that the access log contains the <a href=\"http://nginx.org/en/docs/http/ngx_http_upstream_module.html#var_upstream_response_time%5B%60$upstream_response_time%60%5D\" rel=\"nofollow\">http://nginx.org/en/docs/http/ngx_http_upstream_module.html#var_upstream_response_time[`$upstream_response_time`]</a>, <a href=\"http://nginx.org/en/docs/http/ngx_http_log_module.html#var_request_time%5B%60$request_time%60%5D\" rel=\"nofollow\">http://nginx.org/en/docs/http/ngx_http_log_module.html#var_request_time[`$request_time`]</a> and/or <a href=\"http://nginx.org/en/docs/http/ngx_http_core_module.html#variables%5B%60$body_bytes_sent%60%5D\" rel=\"nofollow\">http://nginx.org/en/docs/http/ngx_http_core_module.html#variables[`$body_bytes_sent`]</a> variables. These need to be enabled in the NGINX configuration (more precisely, the <code class=\"notranslate\">log_format</code> setting) and then added to the  format specified for the exporter.</p>\n<blockquote>\n<p dir=\"auto\">How can I configure NGINX to export these variables?</p>\n</blockquote>\n<p dir=\"auto\">Have a look at NGINX's <a href=\"https://www.nginx.com/resources/admin-guide/logging-and-monitoring/%5BLogging\" rel=\"nofollow\">https://www.nginx.com/resources/admin-guide/logging-and-monitoring/[Logging</a> and Monitoring] guide. It contains some good examples that contain the <code class=\"notranslate\">$request_time</code> and <code class=\"notranslate\">$upstream_response_time</code>:</p>\n<div class=\"snippet-clipboard-content notranslate position-relative overflow-auto\" data-snippet-clipboard-copy-content=\"log_format upstream_time '$remote_addr - $remote_user [$time_local] '\n                         '&quot;$request&quot; $status $body_bytes_sent '\n                         '&quot;$http_referer&quot; &quot;$http_user_agent&quot;'\n                         'rt=$request_time uct=&quot;$upstream_connect_time&quot; uht=&quot;$upstream_header_time&quot; urt=&quot;$upstream_response_time&quot;';\"><pre class=\"notranslate\"><code class=\"notranslate\">log_format upstream_time '$remote_addr - $remote_user [$time_local] '\n                         '\"$request\" $status $body_bytes_sent '\n                         '\"$http_referer\" \"$http_user_agent\"'\n                         'rt=$request_time uct=\"$upstream_connect_time\" uht=\"$upstream_header_time\" urt=\"$upstream_response_time\"';\n</code></pre></div>\n<h2 dir=\"auto\">Credits</h2>\n<ul dir=\"auto\">\n<li><a href=\"https://github.com/hpcloud/tail%5Btail%5D\">https://github.com/hpcloud/tail[tail]</a>, MIT license</li>\n<li><a href=\"https://github.com/satyrius/gonx%5Bgonx%5D\">https://github.com/satyrius/gonx[gonx]</a>, MIT license</li>\n<li><a href=\"https://github.com/prometheus/client_golang%5BPrometheus\">https://github.com/prometheus/client_golang[Prometheus</a> Go client library], Apache License</li>\n<li><a href=\"https://github.com/hashicorp/hcl%5BHashiCorp\">https://github.com/hashicorp/hcl[HashiCorp</a> configuration language], Mozilla Public License</li>\n</ul>","updatedAt":"2025-05-21T16:17:05Z","upvoteCount":null,"author":{"login":"eryajf","avatarUrl":"https://avatars.githubusercontent.com/u/33259379?u=e4a4090a38ac2473aaed4ef9945233636776c6c3&v=4","url":"https://github.com/eryajf"},"category":null,"labels":{"edges":[{"node":{"name":"更多","color":"25B472"}},{"node":{"name":"Prometheus-Exporter","color":"367acb"}},{"node":{"name":"martin-helmich","color":"1f6fd7"}}]},"comments":{"edges":[]}}},"pageContext":{"number":456,"previous":{"title":"feiyu563/PrometheusAlert:  开源的运维告警中心消息转发系统，支持主流的监控系统 Prometheus, Zabbix,  日志系统 Graylog 和数据可视化系统 Grafana 发出的预警消息，支持钉钉，微信，华为云短信，腾讯云短信，腾讯云电话，阿里云短信，阿里云电话等 ","number":455},"next":{"title":"prometheus/prometheus: Prometheus 是一个监控系统和时序数据库，在被广泛应用于云原生的监控","number":457}}},
    "staticQueryHashes": ["151096407","2861350382"]}