Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
¿ªÔ´¼à¿ØÏµÍ³PrometheusµÄǰÊÀ½ñÉú
 
×÷Õߣº ¹ùÕñ
  2409  次浏览      27
 2020-12-10
 
±à¼­ÍƼö:
±¾ÎÄÖ÷Òª½éÉÜPrometheus£¬´ÓËûµÄÀ´Ô´£¬¼Ü¹¹ÒÔ¼°Ò»¸ö¾ßÌåµÄÀý×ӵȷ½ÃæÀ´ËµÃ÷£¬ÒÔ¼°ÎÖÈ¤Î§ÈÆPrometheus×öÁËÄÄЩ¹¤×÷¡£
±¾ÎÄÀ´×ÔÓÚCSDN£¬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼­¡¢ÍƼö¡£

PrometheusÊÇSoundCloud¹«Ë¾¿ªÔ´µÄ¼à¿ØÏµÍ³£¬Í¬Ê±Ò²ÊǼÌKubernetesÖ®ºó£¬µÚ¶þ¸ö¼ÓÈëCNCFµÄÏîÄ¿¡£PrometheusÊÇÒ»¸öÓÅÐãµÄ¼à¿ØÏµÍ³£¬ÎÖÈ¤Î§ÈÆ×ÅPrometheusÏȺ󿪷¢Á˶à¸ö×é¼þ£¬°üÀ¨»ù´¡¸æ¾¯×é¼þ£¬·þÎñ·¢ÏÖ×é¼þ¡¢¸÷Öֲɼ¯µÄExportersµÈ£¬ÕâЩ×é¼þ½áºÏPrometheusÖ§³ÅÁËÎÖȤ´ó²¿·ÖµÄ¼à¿ØÒµÎñ¡£±¾ÎÄÖ÷Òª½éÉÜPrometheus£¬´ÓËûµÄÀ´Ô´£¬¼Ü¹¹ÒÔ¼°Ò»¸ö¾ßÌåµÄÀý×ӵȷ½ÃæÀ´ËµÃ÷£¬ÒÔ¼°ÎÖÈ¤Î§ÈÆPrometheus×öÁËÄÄЩ¹¤×÷¡£

ÆðÔ´

SoundCloud¹«Ë¾µÄ֮ǰµÄÓ¦Óüܹ¹ÊǾÞʯ¼Ü¹¹£¬Ò²¾ÍÊÇËùÓеŦÄÜ·ÅÔÚÒ»¸ö´óµÄÄ£¿éÀ¸÷¸ö¹¦ÄÜÖ®¼äûÓÐÃ÷ÏԵĽçÏß¡£¾Þʯ¼Ü¹¹µÄÓ¦ÓÃÖ÷Òª´æÔÚÁ½·½ÃæµÄÎÊÌ⣬һ·½ÃæÔÚÓÚºÜÄÑ¶ÔÆä½øÐÐˮƽÀ©Õ¹£¬Ö»ÄÜ´¹Ö±À©Õ¹£¬µ«Êǵ¥Ì¨»úÆ÷µÄÄÜÁ¦±Ï¾¹ÊÇÓÐÏ޵ģ»ÁíÍâÒ»·½ÃæÔÚÓÚ¸÷¸ö¹¦ÄÜñîºÏÔÚÒ»¿é£¬ÐÂÔöÒ»¸ö¹¦ÄÜÐèÒªÔÚÒÑÓеļ¼ÊõÕ»ÉϽøÐпª·¢£¬²¢ÇÒҪȷ±£²»»á¶ÔÒÑÓеŦÄÜÔì³ÉÓ°Ïì¡£ÓÚÊÇËûÃÇתÏòÁË΢·þÎñ¼Ü¹¹£¬½«Ô­ÓеŦÄܲð·Ö³ÉÁ˼¸°Ù¸ö¶ÀÁ¢µÄ·þÎñ£¬Õû¸öϵͳÔËÐÐÉÏǧ¸öʵÀý¡£Ç¨ÒƵ½Î¢·þÎñ¼Ü¹¹¸ø¼à¿Ø´øÀ´Ò»¶¨µÄÌôÕ½£¬ÏÖÔÚ²»½öÐèÒªÖªµÀij¸ö×é¼þµÄÔËÐеÄÇé¿ö£¬»¹ÒªÖªµÀ·þÎñµÄÕûÌåÔËÐÐÇé¿ö¡£ËûÃǵ±Ê±µÄ¼à¿Ø·½°¸ÊÇ£ºStatsD + Graphite + Nagios£¬StatsD½áºÏGraphite¹¹½¨¼à¿ØÍ¼±í£¬¸÷¸ö·þÎñ½«Ñù±¾Êý¾ÝÍÆË͸øStatsD£¬StatsD½«ÍÆËÍÀ´µÄÑù±¾Êý¾Ý¾ÛºÏÔÚÒ»Æð£¬¶¨Ê±µØÍÆË͸øGraphite£¬Graphite½«Ñù±¾Êý¾Ý±£´æÔÚʱÐòÊý¾Ý¿âÖУ¬Óû§¸ù¾ÝGraphiteÌṩµÄAPI£¬½áºÏ×ÔÉí¼à¿ØµÄÐèÇ󣬹¹½¨¼à¿ØÍ¼±í£¬Í¨¹ýͼ±í·ÖÎö·þÎñµÄÖ¸±ê£¨ÀýÈ磬ÑÓ³Ù£¬Ã¿ÃëµÄÇëÇóÊý£¬Ã¿ÃëµÄ´íÎóÊýµÈ£©¡£

ÄÇôÕâÑùÒ»ÖÖ·½°¸ÄÜÂú×ã΢·þÎñ¼Ü¹¹¶Ô¼à¿ØµÄÒªÇóô£¿Ê²Ã´ÒªÇóÄØ£º¼ÈÄÜÖªµÀ·þÎñÕûÌåµÄÔËÐÐÇé¿ö£¬Ò²Äܹ»±£³Ö×ã¹»µÄÁ£¶È£¬ÖªµÀij¸ö×é¼þµÄÔËÐÐÇé¿ö¡£´ð°¸ÊǺÜÄÑ£¬ÎªÊ²Ã´ÄØ£¿ÀýÈ磬ÎÒÃÇҪͳ¼Æapi-server·þÎñÏìÓ¦POST /tracksÇëÇó´íÎóµÄÊýÁ¿£¬Ö¸±êµÄÃû³ÆÎªapi-server.tracks.post.500£¬Õâ¸öÖ¸±ê¿ÉÒÔͨ¹ýhttp״̬ÂëÀ´²âÁ¿£¬·þÎñÏìÓ¦µÄ״̬ÂëΪ500¾ÍÊÇ´íÎóµÄ¡£GraphiteÖ¸±êÃû³ÆµÄ½á¹¹ÊÇÒ»ÖÖ²ã´Î½á¹¹£¬api-serverÖ¸¶¨·þÎñµÄÃû³Æ£¬tracksÖ¸¶¨·þÎñµÄhandler£¬postÖ¸¶¨ÇëÇóµÄ·½·¨£¬500Ö¸¶¨ÇëÇóÏìÓ¦µÄ״̬Â룬api-server·þÎñʵÀý½«¸ÃÖ¸±êÍÆË͸øStatsD£¬StatsD¾ÛºÏ¸÷¸öʵÀýÍÆËÍÀ´µÄÖ¸±ê£¬È»ºó¶¨Ê±ÍÆË͸øGraphite¡£²éѯapi-server.tracks.post.500Ö¸±ê£¬ÎÒÃÇÄÜ»ñµÃ·þÎñ´íÎóµÄÏìÓ¦Êý£¬µ«ÊÇ£¬Èç¹ûÎÒÃǵÄapi-server·þÎñÅÜÁ˶à¸öʵÀý£¬ÏëÖªµÀij¸öʵÀý´íÎóµÄÏìÓ¦Êý£¬¸ÃÔõô²éÑ¯ÄØ£¿ÎÊÌâ³öÔÚʹÓÃÕâÑùÒ»Öּܹ¹£¬ÍùÍù»á½«¸÷¸ö·þÎñʵÀý·¢ËÍÀ´µÄÖ¸±ê¾ÛºÏµ½Ò»¿é£¬¾ÛºÏµ½Ò»ÆðÖ®ºó£¬ÊµÀýά¶ÈµÄÐÅÏ¢¾Í¶ªÊ§µôÁË£¬Ò²¾ÍÎÞ·¨Í³¼ÆÄ³¸ö¾ßÌåʵÀýµÄÖ¸±êÐÅÏ¢¡£

StatsDÓëGraphiteµÄ×éºÏÓÃÀ´¹¹½¨¼à¿ØÍ¼±í£¬¸æ¾¯ÊÇÁíÍâÒ»¸öϵͳ-Nagios-À´×öµÄ£¬Õâ¸öϵͳÔËÐмì²â½Å±¾£¬ÅжÏÖ÷»ú»ò·þÎñÔËÐеÄÊÇ·ñÕý³££¬Èç¹û²»Õý³££¬·¢Ë͸澯¡£Nagios×î´óµÄÎÊÌâÔÚÓڸ澯ÊÇÃæÏòÖ÷»úµÄ£¬Ã¿¸ö¸æ¾¯µÄ¼ì²éÏî¶¼ÊÇÎ§ÈÆ×ÅÖ÷»úµÄ£¬ÔÚ·Ö²¼Ê½ÏµÍ³µÄ»·¾³µ×Ï£¬Ö÷»údownµôÊÇÕý³£µÄ³¡¾°£¬·þÎñ±¾ÉíµÄÉè¼ÆÒ²ÊÇ¿ÉÒÔÈÝÈ̽ڵãdownµôµÄ£¬µ«ÊÇ£¬ÕâÖÖ³¡¾°ÏÂNagiosÒÀÈ»»á´¥·¢¸æ¾¯¡£

¶Ô±ÈPrometheus£¬Äã»á·¢ÏÖÕâÁ½¸öϵͳ·Ç³£ÏàËÆ¡£Êµ¼ÊÉÏ£¬PrometheusÉîÊÜBorgmonϵͳµÄÓ°Ï죬²¢ÇÒµ±Ê±²ÎÓë¹¹½¨Google¼à¿ØÏµÍ³µÄÔ±¹¤¼ÓÈëÁËSoundCloud¹«Ë¾¡£×ÜÖ®£¬ÖÖÖÖÒòËØµÄ½áºÏ£¬´ÙʹÁËPrometheusϵͳµÄµ®Éú¡£

PrometheusµÄ½â¾ö·½°¸

ÄÇô£¬PrometheusÊÇÈçºÎ½â¾öÉÏÃæÕâЩÎÊÌâµÄ£¿Ö®Ç°µÄ·½°¸ÖУ¬¸æ¾¯Óëͼ±íµÄ¹¹½¨ÒÀÀµÓÚÁ½¸ö²»Í¬µÄϵͳ£¬Prometheus²ÉÈ¡ÁËÒ»ÖÖеÄÄ£ÐÍ£¬½«²É¼¯Ê±ÐòÊý¾Ý×÷ΪÕû¸öϵͳµÄºËÐÄ£¬ÎÞÂÛÊǸ澯»¹Êǹ¹½¨¼à¿ØÍ¼±í£¬¶¼ÊÇͨ¹ý²Ù×ÝʱÐòÊý¾ÝÀ´ÊµÏֵġ£Prometheusͨ¹ýÖ¸±êµÄÃû³ÆÒÔ¼°label£¨key/value)µÄ×éºÏÀ´Ê¶±ðʱÐòÊý¾Ý£¬Ã¿¸ölabel´ú±íÒ»¸öά¶È£¬¿ÉÒÔÔö¼Ó»òÕß¼õÉÙlabelÀ´¿ØÖÆËùÑ¡ÔñµÄʱÐòÊý¾Ý£¬Ç°ÃæÌáµ½£¬Î¢·þÎñ¼Ü¹¹µ×ÏÂ¶Ô¼à¿ØµÄÒªÇ󣺼ÈÄÜÖªµÀ·þÎñÕûÌåµÄÔËÐÐÇé¿ö£¬Ò²Äܹ»±£³Ö×ã¹»µÄÁ£¶È£¬ÖªµÀij¸ö×é¼þµÄÔËÐÐÇé¿ö¡£½èÖúÓÚÕâÖÖ¶àά¶ÈµÄÊý¾ÝÄ£ÐÍ¿ÉÒÔºÜÇáËɵÄʵÏÖÕâ¸öÄ¿±ê£¬»¹ÊÇÄÃ֮ǰÄǸöͳ¼Æhttp´íÎóÏìÓ¦µÄÀý×ÓÀ´ËµÃ÷£¬ÎÒÃÇÕâÀï¼ÙÉèapi_server·þÎñÓÐÈý¸öÔËÐеÄʵÀý£¬Prometheus²É¼¯µ½ÈçϸñʽµÄÑù±¾Êý¾Ý£¨ÆäÖÐintance labelÊÇPrometheus×Ô¶¯Ìí¼ÓÉÏÈ¥µÄ£©£º

api_server_http_requests_total{method="POST",
handler="/tracks",status="500",instance="sample1"} -> 34
api_server_http_requests_total{method="POST",
handler="/tracks",status="500",instance="sample2"} -> 28
api_server_http_requests_total{method="POST",
handler="/tracks",status="500",instance="sample3"} -> 31

Èç¹ûÎÒÃÇÖ»¹ØÐÄÌØ¶¨ÊµÀýµÄ´íÎóÊý£¬Ö»ÐèÌí¼Óinstance label¼´¿É£¬ÀýÈçÎÒÃÇÏëÒª²é¿´ÊµÀýÃû³ÆÎªsample1µÄ´íÎóµÄÇëÇóÊý£¬ÄÇôÎҾͿÉÒÔÓÃapiserverhttprequeststotal { method="POST",handler="/tracks" , status="500",instance="sample1" } Õâ¸ö±í´ïʽÀ´Ñ¡ÔñʱÐòÊý¾Ý£¬Ñ¡ÔñµÄÊý¾ÝÈçÏ£º

api_server_http_requests_total{method="POST",
handler="/tracks",status="500",instance="sample1"} -> 34

Èç¹ûÎÒÃǹØÐÄÕû¸ö·þÎñµÄ´íÎóÊý£¬Ö»ÐèºöÂÔinstance labelÈ¥³ý£¬È»ºó½«½á¹û¾ÛºÏµ½Ò»¿é£¬¼´¿É£¬ÀýÈç sum without(instance) ( apiserverhttprequeststotal {method = "POST", handler =" /tracks",status="500" }) ¼ÆËãµÃµ½µÄʱÐòÊý¾ÝΪ£º

api_server_http_requests_total{method="POST",
handler="/tracks",status="500"} -> 93

¸æ¾¯ÊÇͨ¹ý²Ù×ÝʱÐòÊý¾Ý¶ø²»ÊÇÔËÐÐÒ»¸ö×Ô¶¨ÒåµÄ½Å±¾À´ÊµÏֵģ¬Òò´Ë£¬Ö»ÒªÄܹ»²É¼¯µ½·þÎñ»òÖ÷»ú±©Â¶³öµÄÖ¸±êÊý¾Ý£¬ÄÇô¾Í¿ÉÒԸ澯¡£

¼Ü¹¹

ÎÒÃÇÔÙÀ´¼òµ¥µÄ·ÖÎöÒ»ÏÂPrometheusµÄ¼Ü¹¹£¬¿´Ò»Ï¸÷¸ö×é¼þµÄ¹¦ÄÜ£¬ÒÔ¼°ÕâЩ×é¼þÖ®¼äÊÇÈçºÎ½»»¥µÄ¡£

Prometheus ServerÊÇÕû¸öϵͳµÄºËÐÄ£¬Ëü¶¨Ê±µØ´Ó¼à¿ØÄ¿±ê£¨Exporters£©±©Â¶µÄAPIÖÐÀ­È¡Ö¸±ê£¬È»ºó½«ÕâЩÊý¾Ý±£´æµ½Ê±ÐòÊý¾Ý¿âÖУ¬Èç¹ûÊÇ¼à¿ØÄ¿±êÊǶ¯Ì¬µÄ£¬¿ÉÒÔ½èÖú·þÎñ·¢ÏֵĻúÖÆ¶¯Ì¬µØÌí¼ÓÕâЩ¼à¿ØÄ¿±ê£¬ÁíÍâËü»¹»á±©Â¶Ö´ÐÐPromQL£¨ÓÃÀ´²Ù×ÝʱÐòÊý¾ÝµÄÓïÑÔ£©µÄAPI£¬ÆäËû×é¼þ£¬ÀýÈçPrometheus Web£¬Grafana¿ÉÒÔͨ¹ýÕâ¸öAPI²éѯ¶ÔÓ¦µÄʱÐòÊý¾Ý¡£Prometheus Server»á¶¨Ê±µØÖ´Ðи澯¹æÔò£¬¸æ¾¯¹æÔòÊÇPromQL±í´ïʽ£¬±í´ïʽµÄÖµÊÇtrue»òfalse£¬Èç¹ûÊÇtrue£¬¾Í½«²úÉúµÄ¸æ¾¯Êý¾ÝÍÆË͸øalertmanger¡£¸æ¾¯Í¨ÖªµÄ¾ÛºÏ¡¢·Ö×é¡¢·¢ËÍ¡¢½ûÓᢻָ´µÈ¹¦ÄÜ£¬²¢²»ÊÇPrometheus ServerÀ´×öµÄ£¬¶øÊÇAlertmanagerÀ´×öµÄ£¬Prometheus ServerÖ»Êǽ«´¥·¢µÄ¸æ¾¯Êý¾ÝÍÆË͸øAlertmanager£¬È»ºóAlertmanger¸ù¾ÝÅäÖý«¸æ¾¯¾ÛºÏµ½Ò»¿é£¬·¢Ë͸ø¶ÔÓ¦µÄ½ÓÊÕÈË¡£

Èç¹ûÎÒÃÇÏëÒª¼à¿Ø¶¨Ê±ÈÎÎñ£¬ÏëÒªinstrumentÈÎÎñµÄÖ´ÐÐʱ¼ä£¬ÈÎÎñÖ´Ðгɹ¦»¹ÊÇʧ°Ü£¬ÄÇôÈçºÎ½«ÕâЩָ±ê±©Â¶¸øPrometheus Server£¿ÀýÈçÿ¸ôÒ»Ìì×öÒ»´ÎÊý¾Ý¿â±¸·Ý£¬ÎÒÃÇÏëÒªÖªµÀÿ´Î±¸·ÝÖ´ÐÐÁ˶೤ʱ¼ä£¬±¸·ÝÊÇ·ñ³É¹¦£¬ÎÒÃDZ¸·ÝÈÎÎñÖ»»áÖ´ÐÐÒ»¶Îʱ¼ä£¬Èç¹û±¸·ÝÈÎÎñ½áÊøÁË£¬Prometheus Server¸ÃÈçºÎÀ­È¡±¸·ÝÖ¸±êµÄÊý¾ÝÄØ£¿½â¾öÕâÖÖÎÊÌ⣬¿ÉÒÔͨ¹ýPrometheusµÄpushgateway×é¼þÀ´×ö£¬Ã¿¸ö±¸·ÝÈÎÎñ½«Ö¸±êÍÆËÍpushgateway×é¼þ£¬pushgateway½«ÍÆËÍÀ´µÄÖ¸±ê»º´æÆðÀ´£¬Prometheus Server´ÓPushgatewayÖÐÀ­È¡Ö¸±ê¡£

Àý×Ó

Ç°Ãæ¶¼ÊǴӱȽϴóµÄ²ãÃæ¡ª¡ª±³¾°¡¢¼Ü¹¹¡ª¡ªÀ´½éÉÜPrometheus£¬ÏÖÔÚ£¬ÈÃÎÒÃÇ´ÓÒ»¸ö¾ßÌåµÄÀý×Ó³ö·¢£¬À´¿´Ò»ÏÂÈçºÎ½èÖúPrometheusÀ´¹¹½¨¼à¿ØÍ¼±í¡¢·ÖÎöϵͳÐÔÄÜÒÔ¼°¸æ¾¯¡£

ÎÒÃÇÓиö·þÎñ£¬±©Â¶³öËĸöAPI£¬Ã¿¸öAPIÖ»·µ»ØÒ»Ð©¼òµ¥µÄÎı¾Êý¾Ý£¬ÏÖÔÚ£¬ÎÒÃÇÒª¶ÔÕâ¸ö·þÎñ½øÐÐ¼à¿Ø£¬Ï£Íû½èÖú¼à¿ØÄܹ»²é¿´¡¢·ÖÎö·þÎñµÄÇëÇóËÙÂÊ£¬ÇëÇóµÄƽ¾ùÑÓ³ÙÒÔ¼°ÇëÇóµÄÑÓ³Ù·Ö²¼£¬²¢ÇÒµ±Ó¦ÓõÄÑÓ³Ù¹ý¸ß»òÕß²»¿É·ÃÎÊʱÄܹ»´¥·¢¸æ¾¯£¬´úÂëʾÀýÈçÏ£º

package main
import (
"math/rand"
"net/http"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
var (
Latency = promauto.NewHistogramVec(prometheus.HistogramOpts{
Help: "latency of sample app",
Name: "sample_app_latency_milliseconds",
Buckets: prometheus.ExponentialBuckets(10, 2, 9),
}, []string{"handler", "method"})
)
func instrumentationFilter(f http.HandlerFunc) http.HandlerFunc {
return func(writer http.ResponseWriter, request *http.Request) {
now := time.Now()
f(writer, request)
duration := time.Now().Sub(now)
Latency.With(prometheus.Labels{"handler": request.URL.Path, "method": request.Method}).
Observe(float64(duration.Nanoseconds()) / 1e6)
}
}
// jitterLatencyFilter make request latency between d and d*maxFactor
func jitterLatencyFilter(d time.Duration, maxFactor float64,
f http.HandlerFunc) http.HandlerFunc {
return func(writer http.ResponseWriter, request *http.Request) {
time.Sleep(d + time.Duration(rand.Float64()*maxFactor*float64(d)))
f(writer, request)
}
}
func main() {
rand.Seed(time.Now().UnixNano())
http.Handle("/metrics", promhttp.Handler())
http.Handle("/a", instrumentationFilter(jitterLatencyFilter
(10*time.Millisecond, 256, func(w http.ResponseWriter,
r *http.Request) { w.Write([]byte("success"))
})))
http.Handle("/b", instrumentationFilter(jitterLatencyFilter
(10*time.Millisecond, 128, func(w http.ResponseWriter,
r *http.Request) { w.Write([]byte("success"))
}))) http.Handle("/c", instrumentationFilter(jitterLatencyFilter
(10*time.Millisecond, 64, func(w http.ResponseWriter,
r *http.Request) { w.Write([]byte("success"))
})))
http.Handle("/d", instrumentationFilter(jitterLatencyFilter
(10*time.Millisecond, 32, func(w http.ResponseWriter,
r *http.Request) { w.Write([]byte("success"))
})))
http.ListenAndServe(":5001", nil)
}

ÎÒÃǰ´ÕÕinstrumentation¡¢exposition¡¢collection¡¢queryÕâÑùµÄÁ÷³Ì¹¹½¨¼à¿ØÏµÍ³£¬instrumentation¹Ø×¢µÄÊÇÈçºÎ²âÁ¿Ó¦ÓõÄÖ¸±ê£¬ÓÐÄÄЩָ±êÐèÒª²âÁ¿£»exposition¹Ø×¢µÄÊÇÈçºÎͨ¹ýhttpЭÒ齫ָ±ê±©Â¶³öÀ´£»collection¹Ø×¢µÄÊÇÈçºÎ²É¼¯Ö¸±ê£»query¹Ø×¢µÄÊÇÈçºÎ¹¹½¨²éѯʱÐòÊý¾ÝµÄPromQL±í´ïʽ¡£ÎÒÃÇÊ×ÏÈ´ÓinstrumentationÕâÀÓÐËĸöÖ¸±êÊÇÎÒÃǹØÐĵģº

1.ÇëÇóËÙÂÊ

2.ÇëÇóµÄƽ¾ùÑÓ³Ù

3.ÇëÇóµÄÑÓ³Ù·Ö²¼

4.·ÃÎÊ״̬

var (
Latency = promauto.NewHistogramVec(prometheus.HistogramOpts{
Help: "latency of sample app",
Name: "sample_app_latency_milliseconds",
Buckets: prometheus.ExponentialBuckets(10, 2, 9),
}, []string{"handler", "method"})
)

Ê×ÏȽ«Ö¸±ê×¢²á½øÀ´£¬È»ºó×·×Ù¡¢¼Ç¼ָ±êµÄÖµ¡£ÓÃPrometheusÌṩµÄgolang¿Í»§¶Ë¿â¿ÉÒÔ·½±ãµÄ×·×Ù¡¢¼Ç¼ָ±êµÄÖµ£¬ÎÒÃǽ«instrumentation code·Åµ½Ó¦ÓõĴúÂëÀÿ´ÎÇëÇ󣬶ÔÓ¦µÄÖ¸±ê״̬µÄÖµ¾Í»á±»¼Ç¼ÏÂÀ´¡£

client golangÌṩÁËËÄÖÖÖ¸±êÀàÐÍ£¬·Ö±ðΪCounter, Gauge, Histogram, Summary£¬CounterÀàÐ͵ÄÖ¸±êÓÃÀ´²âÁ¿Ö»»áÔö¼ÓµÄÖµ£¬ÀýÈç·þÎñµÄÇëÇóÊý£»GaugeÀàÐ͵ÄÖ¸±êÓÃÀ´²âÁ¿×´Ì¬Öµ£¬¼´¿ÉÒÔ±ä´ó£¬Ò²¿ÉÒÔ±äСµÄÖµ£¬ÀýÈçÇëÇóµÄÑÓ³Ùʱ¼ä£»HistogramÓëSummaryÖ¸±êÀàËÆ£¬ÕâÁ½¸öÖ¸±êÈ¡Ñù¹Û²ìµÄÖµ£¬¼Ç¼ֵµÄ·Ö²¼£¬Í³¼Æ¹Û²ìÖµµÄÊýÁ¿£¬Àۼƹ۲쵽µÄÖµ£¬¿ÉÒÔÓÃËüÀ´Í³¼ÆÑù±¾Êý¾ÝµÄ·Ö²¼¡£ÎªÁ˲ɼ¯ÇëÇóËÙÂÊ¡¢Æ½¾ùÑÓ³ÙÒÔ¼°ÑÓ³Ù·Ö²¼Ö¸±ê£¬·½±ãÆð¼ûÓÃHistogramÀàÐ͵ÄÖ¸±ê×·×Ù¡¢¼Ç¼ÿ´ÎÇëÇóµÄÇé¿ö£¬HistogramÀàÐ͵ÄÖ¸±êÓëÆÕͨÀàÐÍ£¨Counter¡¢Gauge£©²»Í¬µÄµØ·½ÔÚÓÚ»áÉú³É¶àÌõÑù±¾Êý¾Ý£¬Ò»¸öÊǹ۲ìÑù±¾µÄ×ÜÊý£¬Ò»¸öÊǹ۲ìÑù±¾ÖµµÄÀÛ¼ÓÖµ£¬ÁíÍâÊÇһϵÁеļǼÑù±¾°Ù·ÖλÊýµÄÑù±¾Êý¾Ý¡£·ÃÎÊ״̬¿ÉÒÔʹÓÃupÖ¸±êÀ´±íʾ£¬Ã¿´Î²É¼¯Ê±£¬Prometheus»á½«²É¼¯µÄ½¡¿µ×´Ì¬¼Ç¼µ½upÖ¸±êÖС£

http.Handle("/metrics", promhttp.Handler())

instrumentationÍê³ÉÖ®ºó£¬ÏÂÒ»²½Òª×öµÄ¾ÍÊÇexposition£¬Ö»Ð轫 Prometheus http handler Ìí¼Ó½øÀ´£¬Ö¸±ê¾Í¿ÉÒÔ±©Â¶³öÀ´¡£·ÃÎÊÕâ¸öHandler·µ»ØµÄÑù±¾Êý¾ÝÈçÏ£¨Ê¡ÂÔÁËһЩÎ޹صÄÑù±¾Êý¾Ý£©£º

sample_app_latency_milliseconds_bucket{handler="/d",
method="GET",le="10"} 0
sample_app_latency_milliseconds_bucket{handler="/d",
method="GET",le="20"} 0
sample_app_latency_milliseconds_bucket{handler="/d",
method="GET",le="40"} 0
sample_app_latency_milliseconds_bucket{handler="/d",
method="GET",le="80"} 0
sample_app_latency_milliseconds_bucket{handler="/d",
method="GET",le="160"} 0
sample_app_latency_milliseconds_bucket{handler="/d",
method="GET",le="320"} 0
sample_app_latency_milliseconds_bucket{handler="/d",
method="GET",le="640"} 1
sample_app_latency_milliseconds_bucket{handler="/d",
method="GET",le="1280"} 1
sample_app_latency_milliseconds_bucket{handler="/d",
method="GET",le="2560"} 1
sample_app_latency_milliseconds_bucket{handler="/d",
method="GET",le="+Inf"} 1
sample_app_latency_milliseconds_sum{handler="/d",
method="GET"} 326.308075
sample_app_latency_milliseconds_count{handler="/d",
method="GET"} 1

½ö½ö½«Ö¸±ê±©Â¶³öÀ´£¬²¢²»ÄÜÈÃprometheus serverÀ´²É¼¯Ö¸±ê£¬ÎÒÃÇÐèÒª½øÐеÚÈý²½collection£¬ÅäÖÃprometheus server·¢ÏÖÎÒÃǵķþÎñ£¬´Ó¶ø²É¼¯·þÎñ±©Â¶³öµÄÑù±¾Êý¾Ý¡£ÎÒÃǼòµ¥µØ¿´ÏÂprometheus serverµÄÅäÖã¬ÆäÖУ¬globalÖ¸¶¨²É¼¯Ê±È«¾ÖÅäÖ㬠scrape_intervalÖ¸¶¨²É¼¯µÄ¼ä¸ô£¬ evaluation_intervalÖ¸¶¨ alerting rule£¨alerting ruleÊÇPromQL±í´ïʽ£¬ÖµÎª²¼¶ûÀàÐÍ£¬Èç¹ûΪtrue¾Í½«Ïà¹ØµÄ¸æ¾¯Í¨ÖªÍÆË͸øAlertmanager£©Ò²¾ÍÊǸ澯¹æÔòµÄÇóֵʱ¼ä¼ä¸ô£¬scrape_timeoutÖ¸¶¨²É¼¯Ê±µÄ³¬Ê±Ê±¼ä£»alertingÖ¸¶¨Alertmanager·þÎñµÄµØÖ·£»scrape_configsÖ¸¶¨ÈçºÎ·¢ÏÖ¼à¿Ø¶ÔÏ󣬯äÖÐjobnameÖ¸¶¨·¢ÏֵķþÎñÊôÓÚÄÄÒ»À࣬staticconfigsÖ¸¶¨·þÎñ¾²Ì¬µÄµØÖ·£¬Ç°ÃæÎÒÃÇÒ²Ìáµ½£¬PrometheusÖ§³Ö¶¯Ì¬·þÎñ·¢ÏÖ£¬ÀýÈçÎļþ¡¢kubernetes·þÎñ·¢ÏÖ»úÖÆ£¬ÕâÀïÎÒÃÇʹÓÃ×î¼òµ¥µÄ¾²Ì¬·þÎñ·¢ÏÖ»úÖÆ¡£

# my global config
global:
scrape_interval: 2s # Set the scrape interval to every 15
seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds.
The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
rule_files:
- rule.yaml
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
- localhost:9093
scrape_configs:
- job_name: sample-app
scrape_interval: 3s
static_configs:
- targets:
- sample:5001

²É¼¯ÍêÖ¸±ê£¬¾Í¿ÉÒÔÀûÓÃPrometheusÌṩµÄPromQLÓïÑÔÀ´²Ù×ݲɼ¯µÄʱÐòÊý¾Ý£¬ÀýÈ磬ÎÒÃÇÏëͳ¼ÆÇëÇóµÄƽ¾ùËÙÂÊ£¬¿ÉÒÔÓÃÕâ¸ö±í´ïʽ irate(sampleapplatencymillisecondssum[1m]) / irate(sampleapplatencymillisecondscount[1m])À´¼ÆËã¡£

ÓÐÁËʱÐòÊý¾ÝÖ®ºó£¬¾Í¿ÉÒÔ½èÖúGrafanaÀ´¹¹½¨¼à¿ØÍ¼±í£¬¾ßÌåÔõôÅäÖÃGrafanaͼ±íÔÚÕâÀï¾Í²»Õ¹¿ªÁË£¬ºËÐĵãÊÇÀûÓÃPromQL±í´ïʽѡÔñ¡¢¼ÆËãʱÐòÊý¾Ý¡£

PrometheusµÄ¸æ¾¯ÊÇͨ¹ý¶ÔAlerting RuleÇóÖµÀ´ÊµÏֵģ¬alerting ruleÊÇһϵÁеÄPromQL±í´ïʽ£¬alerting rule±£´æÔÚÅäÖÃÎļþÖС£ÎÒÃÇÏëÒª¶ÔÓ¦ÓõÄÑÓ³ÙÒÔ¼°¿ÉÓÃ״̬½øÐи澯£¬µ±Ó¦Óùý¸ß»òÕß²»¿É·ÃÎÊʱ¾Í´¥·¢¸æ¾¯£¬¹æÔò¿ÉÒÔÈçÏÂÕâÑù¶¨Ò壺

- name: sample-up
rules:
- alert: UP
expr: up{instance="sample:5001"} == 0
for: 1m
labels:
severity: page
annotations:
summary: Service health
- alert: 95th-latency
expr: histogram_quantile(0.95, rate(sample_app_latency
_milliseconds_bucket[1m])) > 1000
for: 1m
labels:
severity: page
annotations:
summary: 95th service latency

ÆäÖÐUPÖ¸¶¨·þÎñµÄ¿ÉÓÃ״̬£¬95th-latencyÖ¸¶¨95%µÄÇëÇó´óÓÚ1000ºÁÃë¾Í´¥·¢¸æ¾¯¡£Prometheus¶¨Ê±µÄ¶ÔÕâЩ¹æÔò½øÐÐÇóÖµ£¬Èç¹ûÌõ¼þÂú×㣬¾Í½«¸æ¾¯Í¨Öª·¢Ë͸øAlertmanger£¬Alertmanger»á¸ù¾Ý×ÔÉí·ÓÉÅäÖ㬶Ը澯½øÐоۺϣ¬·Ö·¢µ½Ö¸¶¨µÄ½ÓÊÕÈË£¬ÎÒÃÇÏëͨ¹ýÓÊÏä½ÓÊÕµ½¸æ¾¯£¬¿ÉÒÔÈçϽøÐÐÅäÖãº

global:
smtp_smarthost: <your_smtp_server>
smtp_auth_username: <your_username>
smtp_from: <from>
smtp_auth_password: <secret>
smtp_require_tls: false
resolve_timeout: 5m
route:
receiver: me
receivers:
- name: me
email_configs:
- to: example@domain.com
templates:
- '*.tmpl'

ÕâÑù£¬ÎÒÃǾͿÉÒÔͨ¹ýÓÊÏäÊÕµ½¸æ¾¯ÓʼþÁË¡£

Ïà¹ØµÄ¹¤×÷

ÎÞÂÛÊÇ¼à¿ØÍ¼±íÏà¹ØµÄÒµÎñ£¬»¹ÊǸ澯Ïà¹ØµÄÒµÎñ£¬¶¼Àë²»¿ªÏà¹ØÖ¸±êµÄ²É¼¯¹¤×÷£¬ÎÖȤÊÇÒ»¼Ò×öÊý¾Ý¿â²úÆ·µÄ¹«Ë¾£¬ÎÒÃÇ»¨·ÑÁ˺ܶàµÄ¾«Á¦È¥²É¼¯Êý¾Ý¿âÏà¹ØµÄÖ¸±ê£¬´ÓOracleµ½MySQL£¬ÔÙµ½SQL Server£¬Ö÷Á÷µÄ¹ØÏµÐÍÊý¾Ý¿âµÄÖ¸±ê¶¼Óвɼ¯¡£¶ÔÓÚһЩͨÓõÄÖ¸±ê£¬ÀýÈç²Ù×÷ϵͳÏà¹ØµÄÖ¸±ê£¬ÎÒÃÇÖ÷ÒªÊǽèÖú¿ªÔ´µÄExportersÀ´²É¼¯µÄ¡£ÎÖȤµÄ²úÆ·ÊÇÈí¡¢Ó²Ò»Ìå½»¸¶µÄ£¬ÆäÖÐÓдóÁ¿Ó²¼þÏà¹ØµÄÖ¸±êÐèÒª²É¼¯£¬Òò´Ë£¬ÎÒÃÇÒ²ÓÐרÃŲɼ¯Ó²¼þÖ¸±êµÄExpoters¡£

ÎÖȤ´ó²¿·Ö³¡¾°ÖУ¬Òª¼à¿ØµÄ·þÎñ¶¼ÊǶ¯Ì¬µÄ¡£±ÈÈ磬Óû§´Óƽ̨ÉÏÉêÇëÁËÒ»¸öÊý¾Ý¿â£¬ÐèÒªÔö¼ÓÏà¹ØµÄ¼à¿Ø·þÎñ£¬Óû§É¾³ýÊý¾Ý¿â×ÊÔ´£¬ÐèÒªÒÆ³ýÏà¹ØµÄ¼à¿Ø·þÎñ£¬Òª¼à¿ØµÄÊý¾Ý¿â·þÎñ´¦ÓÚ¶¯Ì¬µÄ±ä»¯Ö®ÖС£ÎÖȤÿ¸ö²úÆ·ÏߵĻù´¡¼Ü¹¹¶¼²»Ïàͬ£¬Êý¾Ý¿â·þÎñÓÐÅÜÔÚOracle RACÉϵģ¬ÓÐÅÜÔÚZStackµÄ£¬ÓÐÅÜÔÚKubernetesÉϵġ£¶ÔÓÚÅÜÔÚKubernetesÉϵÄÓ¦ÓÃÀ´Ëµ£¬²¢ÐèÒªµ£ÐÄPrometheusÔõô·¢ÏÖÒª¼à¿ØµÄ·þÎñ£¬Ö»ÐèÒªÅäÖÃÏà¹ØµÄ·þÎñ·¢ÏֵĻúÖÆ¾Í¿ÉÒÔÁË¡£¶ÔÓÚÆäËûÀàÐ͵ģ¬ÎÒÃÇÖ÷Òª½èÖúPrometheusµÄfile_sd·þÎñ·¢ÏÖ»úÖÆÀ´ÊµÏÖ£¬»ùÓÚÎļþµÄ·þÎñ·¢ÏÖ»úÖÆÊÇÒ»ÖÖ×îͨÓõĻúÖÆ£¬ÎÒÃǽ«Òª¼à¿ØµÄ¶ÔÏóдµ½Ò»¸öÎļþÖУ¬Prometheus¼àÌýÕâ¸öÎļþµÄ±ä¶¯£¬¶¯Ì¬µÄά»¤Òª¼à¿ØµÄ¶ÔÏó£¬ÎÒÃÇÔÚfile_sd»ù´¡ÉϹ¹½¨ÁËרÃŵÄ×é¼þÈ¥¸ºÔð·þÎñµÄ¶¯Ì¬¸üУ¬ÆäËûÓ¦Óõ÷ÓÃÕâ¸ö×é¼þ±©Â¶µÄAPIÀ´Î¬»¤×ÔÉíÏëÒª¼à¿ØµÄ¶ÔÏó¡£

Prometheus±¾ÉíµÄ»úÖÆµÄ²¢²»ÄÜÂú×ãÎÒÃÇÒµÎñÉ϶Ը澯µÄÒªÇó£¬Ò»·½ÃæÎÒÃÇÐèÒª¶Ô¸æ¾¯Í¨Öª½øÐÐͳ¼Æ£¬µ«ÊÇAlertmanager±¾Éí²¢Ã»ÓжԸ澯֪ͨ×ö³Ö¾Ã»¯£¬·þÎñÖØÆôÖ®ºó¸æ¾¯Í¨Öª¾Í¶ªÊ§µôÁË£»ÁíÍâÒ»·½ÃæÓû§Í¨¹ýWebÒ³ÃæÀ´ÅäÖÃÏà¹ØµÄ¸æ¾¯£¬¸æ¾¯¹æÔòÒÔ¼°¸æ¾¯Í¨ÖªµÄ·ÓÉÐèÒª¸ù¾ÝÓû§µÄÅäÖö¯Ì¬µÄÉú³É¡£ÎªÁ˽â¾öÕâÁ½·½ÃæµÄÎÊÌ⣬ÎÒÃǽ«Ïà¹ØµÄÒµÎñ¹¦ÄÜ×ö³É»ù´¡µÄ¸æ¾¯×é¼þ£¬¹©¸÷¸ö²úÆ·ÏßȥʹÓá£Õë¶ÔAlertmanager²»Äܳ־û¯¸æ¾¯Í¨ÖªµÄÎÊÌ⣬»ù´¡¸æ¾¯×é¼þÀûÓÃAlertmanager webhookµÄ»úÖÆÀ´½ÓÊո澯֪ͨ£¬È»ºó½«Í¨Öª±£´æµ½Êý¾Ý¿âÖУ»ÁíÍâÓû§µÄ¸æ¾¯ÅäÖÃÐèÒª¶¯Ì¬µÄÉú³É£¬ÎÒÃǶ¨ÒåÁËÒ»ÖÖеÄÄ£ÐÍÀ´ÃèÊöÎÒÃÇÒµÎñÉϵĸ澯ģÐÍ¡£

×ܽá

Promtheus½«²É¼¯Ê±ÐòÊý¾Ý×÷ΪÕû¸öϵͳµÄºËÐÄ£¬ÎÞÂÛÊǹ¹½¨¼à¿ØÍ¼±í»¹ÊǸ澯£¬¶¼ÊÇͨ¹ý²Ù×ÝʱÐòÊý¾ÝÀ´Íê³ÉµÄ¡£Prometheus½èÖú¶àά¶ÈµÄÊý¾ÝÄ£ÐÍ£¬ÒÔ¼°Ç¿´óµÄ²éѯÓïÑÔÂú×ãÁË΢·þÎñ¼Ü¹¹µ×ÏÂ¶Ô¼à¿ØµÄÒªÇ󣺼ÈÄÜÖªµÀ·þÎñÕûÌåµÄÔËÐÐÇé¿ö£¬Ò²Äܹ»±£³Ö×ã¹»µÄÁ£¶È£¬ÖªµÀij¸ö×é¼þµÄÔËÐÐÇé¿ö¡£ÎÖȤվÔÚ¾ÞÈ˵ļçÅÔÉÏ£¬Î§ÈÆPrometheus¹¹½¨ÁË×Ô¼ºµÄ¼à¿ØÏµÍ³£¬´ÓÂú×㲻ͬ²É¼¯ÒªÇóµÄExportersµ½·þÎñ·¢ÏÖ£¬×îºóµ½»ù´¡¸æ¾¯×é¼þ£¬ÕâЩ×é¼þ½áºÏPrometheus£¬¹¹³ÉÁËÎÖȤ¼à¿ØÏµÍ³µÄºËÐÄ¡£

 
   
2409 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

DevOpsתÐÍÈÚÈëµ½ÆóÒµÎÄ»¯
DevOps ÄÜÁ¦Ä£ÐÍ¡¢Ñݽø¼°°¸ÀýÆÊÎö
»ùÓÚ DevOps ÀíÄîµÄ˽ÓÐ PaaS ƽ̨ʵ¼ù
΢Èí¿ª·¢ÍŶӵÄDevOpsʵ¼ùÆôʾ
Ïà¹ØÎĵµ

DevOpsÇý¶¯Ó¦ÓÃÔËά±ä¸ïÓë´´ÐÂ
ÔËά¹ÜÀí¹æ»®
ÈçºÎʵÏÖÆóÒµÓ¦Óò¿Êð×Ô¶¯»¯
ÔËά×Ô¶¯»¯Êµ¼ù֮·
Ïà¹Ø¿Î³Ì

×Ô¶¯»¯ÔËά¹¤¾ß£¨»ùÓÚDevOps£©
»¥ÁªÍøÔËάÓëDevOps
MySQLÐÔÄÜÓÅ»¯¼°ÔËάÅàѵ
ITϵͳÔËά¹ÜÀí
 
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
 
×îÐÂÎÄÕÂ
DevOps µÀ·¨ÊõÆ÷£¬Á¢Ì廯ʵʩ¿ò¼Ü
DevOps ÖиßЧ²âÊÔ»ù´¡¼Ü¹¹µÄ×î¼Ñʵ¼ù
DevOps ÔÚ¹«Ë¾ÏîÄ¿ÖеÄʵ¼ùÂ䵨
ÈçºÎ»ùÓÚ Kubernetes ¹¹½¨ÍêÕûµÄ DevOps Á÷Ë®Ïß
°¢ÀïÔÆKubernetesʵս
×îпγÌ
DevOpsÌåϵʵ¼ù¡¢¹¤¾ßÓëÆ½Ì¨
»ùÓÚKubernetesµÄDevOpsʵ¼ù
»¥ÁªÍøÔËάÓëDevOps
»ùÓÚKubernetes¹¹½¨ÆóÒµÈÝÆ÷ÔÆ
ÆóÒµ¼¶DevOps¹¤×÷ÌåϵÓëÆ½Ì¨
³É¹¦°¸Àý
±±¾© DevOpsÌåϵʵ¼ù¡¢¹¤¾ßÓëÆ½Ì¨
ÉñÁúÆû³µ DevOpsÌåϵʵ¼ù¡¢¹¤¾ßÓëÆ½Ì¨
ÖйúÒÆ¶¯Í¨ÐÅ ÍøÂç¹æ»®Óë¹ÜÀí
ijº½¿Õ¹«Ë¾ IT¹æ»®ÓëÆóÒµ¼Ü¹¹
ij½ðÈÚ¹«Ë¾ IT·þÎñ¹ÜÀí£¨ITIL V3£©