±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜ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£¬¹¹³ÉÁËÎÖȤ¼à¿ØÏµÍ³µÄºËÐÄ¡£
|
|