рд╣рдо рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рд╕реЗ рдХреИрд╕реЗ рдЬреБрдбрд╝реЗ

рдХрд┐рд╕реА рддрд░рд╣ рдореБрдЭреЗ рдЕрдкрдиреЗ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдкрдбрд╝рд╛, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ (рдХреЛрдИ рд╕рдордп рдирд╣реАрдВ!) рдмрд╛рдж рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП - рдпрд╣ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдФрд░ рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ - рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред рдиреЗрдЯ рдкрд░ рдХреБрдЫ рднрдЯрдХрдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдирд┐рдЧрд░рд╛рдиреА рдкреНрд░рдгрд╛рд▓реА, рдпрд╣ рдореБрдЭреЗ рдкреНрд░рддреАрдд рд╣реБрдЖ, рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдерд╛ред


рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдХрдВрдкреНрдпреВрдЯрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ: рдореЗрдореЛрд░реА, рдкреНрд░реЛрд╕реЗрд╕рд░, рдбрд┐рд╕реНрдХ, рдиреЗрдЯрд╡рд░реНрдХ рд▓реЛрдбред рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдПрдкреАрдЖрдИ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдпрд╛ рдЙрдирдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рдордп рдХреЛ рдорд╛рдкрдирд╛ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рднрд╛рд░ рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рд╣реЛрдЧрд╛, рдЙрддрдирд╛ рд╣реА рдорд╣рдВрдЧрд╛ рдЗрд╕рдХрд╛ рдбрд╛рдЙрдирдЯрд╛рдЗрдоред рдФрд░ рдпрд╣рд╛рдБ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИред рдпрд╣ рд▓реЗрдЦ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХреЗ рдХрд╛рдо рдХреЛ рд╕рдордЭрдиреЗ рдФрд░ рдПрдкреАрдЖрдИ рдореЗрдВ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдмрд┐рдВрджреБред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред


рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдПрдХ рдУрдкрди рд╕реЛрд░реНрд╕ рд╕рд┐рд╕реНрдЯрдо рдФрд░ рдЯрд╛рдЗрдо рд╕реАрд░реАрдЬрд╝ рдбреАрдмреАрдПрдордПрд╕ рд╣реИ рдЬрд┐рд╕реЗ рдЧреЛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╕рд╛рдЙрдВрдбрдХреНрд▓рд╛рдЙрдб рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреНрд░рд▓реЗрдЦрди рдФрд░ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реИ: рдЧреЛ, рдЬрд╛рд╡рд╛ рдпрд╛ рд╕реНрдХрд╛рд▓рд╛, рдкрд╛рдпрдерди, рд░реВрдмреАред рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рд╕рдорд░реНрдерди рд╣реИ, рдЬреИрд╕реЗ: C #, C ++, C, Bash, Lua for Nginx, Lua for Tarantool рдФрд░ рдЕрдиреНрдп, рдкреВрд░реА рд╕реВрдЪреА рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Prometheus рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рд╣реИред


рд╕рднреА рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рд╕реЗрд╡рд╛рдПрдВ рдбреЛрдХрд░ рд╣рдм рдпрд╛ рдХреНрд╡рд╛рдЗрдУ рдкрд░ рдбреЛрдХрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред


рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХреЛ docker run -p 9090:9090 prom/prometheus рджреНрд╡рд╛рд░рд╛ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯ localhost:9090 рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдпреВрдЖрдИ localhost:9090 рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛ред


рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдПрдХ рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╣реИ рдЬрд┐рд╕рдореЗрдВ HTTP рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди (рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕) рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдХрд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдкрд░, HTTP рдПрдкреАрдЖрдИ "рдореВрд▓ рд╕реНрдерд┐рддрд┐" рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдЖрдк рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдкреНрд░реЙрдХреНрд╕реА рд╕реНрддрд░ рдкрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЖрдк рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рд░рд┐рд╡рд░реНрд╕ рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХреЗ рдореБрдЦреНрдп рдШрдЯрдХ:


  • рдПрдХ рд╕рд░реНрд╡рд░ рдЬреЛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рд╣реЗрдЬрддрд╛ рд╣реИ рдФрд░ рд╕рд╛рдл рдХрд░рддрд╛ рд╣реИ;
  • рдПрдкреАрдЖрдИ рдореЗрдВ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ;
  • рдкреБрд╢рдЧреЗрдЯрд╡реЗ - рдЙрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рд╕реЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдШрдЯрдХ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ;
  • рдирд┐рд░реНрдпрд╛рддрдХреЛрдВ - рд▓рдХреНрд╖реНрдп рдорд╢реАрдиреЛрдВ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рддреГрддреАрдп-рдкрдХреНрд╖ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдФрд░ рд╕реЗрд╡рд╛рдУрдВ рд╕реЗ рдореАрдЯреНрд░рд┐рдХ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг;
  • AlertManager - рд╕реВрдЪрдирд╛ рдкреНрд░рдмрдВрдзрдХ (рдЕрд▓рд░реНрдЯ), рдЕрд▓рд░реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ рдФрд░ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдореЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред
    рдпрджрд┐ рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдирд┐рдпрдо рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЕрд▓рд░реНрдЯ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдИрдореЗрд▓, рд╕реНрд▓реИрдХ рдпрд╛ рдЕрдиреНрдп рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛рдУрдВ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдЬрд┐рди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рд▓рдХреНрд╖реНрдп рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рддреЛ рдкреБрд╢рдЧреЗрдЯрд╡реЗ рдпрд╛ рдирд┐рд░реНрдпрд╛рддрдХреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред


рдореИрдЯреНрд░рд┐рдХреНрд╕ рдПрдХрддреНрд░рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


  • рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рдХреНрд╖реНрдп рд╕реЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкреНрд░рддреНрдпреЗрдХ рдиреМрдХрд░реА рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░реЗрдк_рдХреЙрдиреНрдлрд╝рд┐рдЧ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реЛрддреА рд╣реИрдВред
    рдЬрдм рд╕рд┐рд╕реНрдЯрдо рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╕рдВрдЧреНрд░рд╣ рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдЖрд╡реГрддреНрддрд┐ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдХрдИ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ;
  • рдирд┐рд░реНрдпрд╛рддрдХ рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рд╡рд╕реНрддреБрдУрдВ рд╕реЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдбреЗрдЯрд╛рдмреЗрд╕ (MongoDB, SQL, рдЖрджрд┐), рд╕рдВрджреЗрд╢ рджрд▓рд╛рд▓ (RabbitMQ, EMQ, NSQ, рдЖрджрд┐), HTTP рд▓реЛрдб рдмреИрд▓реЗрдВрд╕рд░реНрд╕, рдЖрджрд┐ред
  • Pushgatewayред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХреЛ рд╕реАрдзреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рджреЗрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ; рдпрд╛ рдмреИрдЪ рдиреМрдХрд░рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЬрд┐рд╕рдореЗрдВ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рднреА рдкреНрд░рд╛рдкреНрдд рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рджреНрд╡рд╛рд░рд╛ рд╕рдордп рдЯрд┐рдХрдЯреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред


рд╡рд┐рдиреНрдпрд╛рд╕


рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХреЛ YAML рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рдЭрдВрдбреЗ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЗ рдЭрдВрдбреЗ рдЖрдкрдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ: рдкрде, рдбрд┐рд╕реНрдХ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдбреЗрдЯрд╛ рд╡реЙрд▓реНрдпреВрдо рдФрд░ рдореЗрдореЛрд░реА рдореЗрдВ, рдЖрджрд┐ред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдЖрдкрдХреЛ рдиреМрдХрд░рд┐рдпреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдФрд░ рд▓реЛрдб рдХрд┐рдП рдЧрдП рдирд┐рдпрдо рдпрдорд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рд╕рдм рдХреБрдЫ рд╡реИрд╢реНрд╡рд┐рдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдЖрдкрдХреЛ рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕реЗрдЯ рдХрд░рдиреЗ рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдЪреБрдирд╛рд╡реЛрдВ рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓ рдореЗрдВ scrape_configs рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдирдпрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЕрдорд╛рдиреНрдп рд╣реИ, рддреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ --web.enable-lifecycle рдХрд░рдиреЗ рд╕реЗ --web.enable-lifecycle Prometheus рдХрдорд╛рдВрдб рднреЗрдЬрдХрд░ рдпрд╛ HTTP POST рдЕрдиреБрд░реЛрдз /-/reload рдХрд░рдХреЗ --web.enable-lifecycle , рдмрд╢рд░реНрддреЗ рдХрд┐ --web.enable-lifecycle рдзреНрд╡рдЬ --web.enable-lifecycle ред рдпрд╣ рд╕рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреА рдЧрдИ рдирд┐рдпрдо рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рднреА рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░реЗрдЧрд╛ред


рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ


рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдПрдХ рдХрд╕реНрдЯрдо рдмрд╣реБрдЖрдпрд╛рдореА рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрд╣реБ-рдЖрдпрд╛рдореА рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд╡реЗрд░реА рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкреНрд░реЛрдорд╕реЗрд▓ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рд╕рдордп рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ; рдпрд╣ рдХрдИ рднрдВрдбрд╛рд░рдг рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ:


  • рд╕реНрдерд╛рдиреАрдп рдбрд┐рд╕реНрдХ рднрдВрдбрд╛рд░рдг: рд╣рд░ 2 рдШрдВрдЯреЗ рдореЗрдВ, рд╕реНрдореГрддрд┐ рдореЗрдВ рдмрдлрд╝рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдХ рдкрд░ рд╕рдВрдкреАрдбрд╝рд┐рдд рдФрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, ./data рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрдХреБрдЪрд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╢реАрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
  • рд░рд┐рдореЛрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА: рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдлрд░ рдПрдбреЙрдкреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдХрд╛рдлреНрдХрд╛, рдкреЛрд╕реНрдЯрдЧреНрд░реИрд╕рдХреНрдпреВ, рдЕрдореЗрдЬрд╝реЕрди рдПрд╕ 3, рдЖрджрд┐) рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

рд╕рдВрдЧреНрд░рд╣реАрдд рд╕рдордп рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореАрдЯреНрд░рд┐рдХ рдФрд░ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рджреНрд╡рд╛рд░рд╛ рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдЬреЛрдбрд╝реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдореАрдЯреНрд░рд┐рдХ рдХреЗ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдореАрдЯреНрд░рд┐рдХ рдореЗрдВ рдХреЗрд╡рд▓ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ред рдПрдХ рд╕рдордп рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ <рдореАрдЯреНрд░рд┐рдХ рдирд╛рдо> {<рдореЗрдЯрд╛рдбреЗрдЯрд╛>} рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреБрдВрдЬреА рд╣реИ <рдореАрдЯреНрд░рд┐рдХ рдирд╛рдо> {<рдореЗрдЯрд╛рдбреЗрдЯрд╛>} - рд╣рдо рдЬреЛ рдорд╛рдк рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдорд╛рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореВрд▓реНрдп рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдлреНрд▓реЛрдЯ64 (рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХреЗрд╡рд▓ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ) рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдореБрдЦреНрдп рд╡рд┐рд╡рд░рдг рдореЗрдВ рдореЗрдЯрд╛рдбреЗрдЯрд╛ (рд▓реЗрдмрд▓) рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдпреБрдЧреНрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рднреА рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: <рд▓реЗрдмрд▓ рдирд╛рдо> = "<рд▓реЗрдмрд▓ рдорд╛рди>", <рд▓реЗрдмрд▓ рдирд╛рдо> = "<рд▓реЗрдмрд▓ рдорд╛рди>", ...


рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╕рдордп, рдирд┐рдореНрди рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:


  • рдХрд╛рдЙрдВрдЯрд░ - рд╕рдордп рдХреА рдЕрд╡рдзрд┐ рдореЗрдВ рд░рд╛рд╢рд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдореАрдЯреНрд░рд┐рдХ рдХреЗрд╡рд▓ рдмрдврд╝ рд╕рдХрддреА рд╣реИ (рдЖрдк рдирдХрд╛рд░рд╛рддреНрдордХ рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдпрд╛ рдорд╛рди рд░реАрд╕реЗрдЯ рдХрд░реЗрдВред
    рдпрд╣ рдЙрдкрдпреБрдХреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рддрд┐ рдорд┐рдирдЯ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдпрд╛ рдкреНрд░рддрд┐ рджрд┐рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рднреЗрдЬреЗ рдЧрдП / рдкреНрд░рд╛рдкреНрдд рдиреЗрдЯрд╡рд░реНрдХ рдкреИрдХреЗрдЯреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЖрджрд┐ рдХреЗ рд▓рд┐рдПред
  • рдЧреЗрдЬ - рдЙрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕рдордп рдХреЗ рд╕рд╛рде рдШрдЯ рдпрд╛ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
    рд╕рдордп рдХреА рдЕрд╡рдзрд┐ рдореЗрдВ рдЧреЗрдЬ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдирд╣реАрдВ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдЧреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рд╕рдордп рдХреЗ рд╕рд╛рде рдЕрдирд┐рдпрдорд┐рдд рдореАрдЯреНрд░рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рдЦреЛ рд╕рдХрддреЗ рд╣реИрдВред
  • рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо - рдХрдИ рд╕рдордп рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдЪрд╛рддрд╛ рд╣реИ: рд╕рднреА рдордирд╛рдпрд╛ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдХреБрд▓ рдпреЛрдЧ; рджреЗрдЦреА рдЧрдИ рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛;
    рд╕рдВрдЪрдп рдХрд╛рдЙрдВрдЯрд░ (рдмрд╛рд▓реНрдЯреА) - рд▓реЗрдмрд▓ рдореЗрдВ le="<upper inclusive bound>" рд░реВрдк рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
    рдорд╛рдиреЛрдВ рдХреЛ рдКрдкрд░реА рдКрдкрд░реА рд╕реАрдорд╛ (рдмрд╛рд▓реНрдЯреА) рд╡рд╛рд▓реЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рд╕рд╛рд░рд╛рдВрд╢ - рдХрдИ рд╕рдордп рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдЪрд╛рддрд╛ рд╣реИ: рд╕рднреА рдордирд╛рдпрд╛ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдХреБрд▓ рдпреЛрдЧ; рджреЗрдЦреА рдЧрдИ рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛;
    рджреЗрдЦреА рдЧрдИ рдШрдЯрдирд╛рдУрдВ рдХреЗ рдкреНрд░рд╡рд╛рд╣ ╧Ж-quantiles (0 ╧Ж ╧Ж of 1) - рдХреЛ quantile="<╧Ж>" рд░реВрдк рдореЗрдВ рд▓реЗрдмрд▓ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдбреЗрдЯрд╛ рдХреИрд╕реЗ рдмрдЪрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?


рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдПрдХ рдЪрд▓ рд░рд╣реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд░реИрдо рдХреЗ "2/3" рджреЗрдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реИред
рдореЗрдореЛрд░реА рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдЪрдВрдХ рдирд╛рдордХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдореАрдЯреНрд░рд┐рдХ рдХреА рдЕрдкрдиреА рдлрд╝рд╛рдЗрд▓ рд╣реЛрддреА рд╣реИред рд╕рднреА рдЪрдВрдХ рдлрд╛рдЗрд▓реЗрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрдВ, рдХреЗрд╡рд▓ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдирдпрд╛ рдбреЗрдЯрд╛ рдЪрдВрдХ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╣рд░ 2 рдШрдВрдЯреЗ рдореЗрдВ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╕реНрдЯреНрд░реАрдо рдбреЗрдЯрд╛ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдбрд┐рд╕реНрдХ рдкрд░ рд▓рд┐рдЦрддреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рджреЛ рдШрдВрдЯреЗ рдХреЗ рдмреНрд▓реЙрдХ рдореЗрдВ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдЪрдВрдХ рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрддреА рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЙрд╕ рд╕рдордп рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕рдордп рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдирдореВрдиреЗ рд╣реЛрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдлрд╝рд╛рдЗрд▓ рдФрд░ рдПрдХ рдЗрдВрдбреЗрдХреНрд╕ рдлрд╝рд╛рдЗрд▓ (рдЬреЛ рдЪрдВрдХ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рдордп рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓рд┐рдП рдореИрдЯреНрд░рд┐рдХреНрд╕ рдФрд░ рд▓реЗрдмрд▓ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рддреА рд╣реИ)ред рдЕрдЧрд░ рдПрдХ рдШрдВрдЯреЗ рдХреЗ рднреАрддрд░ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдбреЗрдЯрд╛ рдХреЛ рдЪрдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдбрд┐рд╕реНрдХ рдкрд░ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдбреЗрдЯрд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рдЪрдВрдХреА рдмрдирд╛рдИ рдЬрд╛рдПрдЧреАред рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдореЗрдВ рдЕрдзрд┐рдХрддрдо рдбреЗрдЯрд╛ рдЕрд╡рдзрд╛рд░рдг рдЕрд╡рдзрд┐ ~ 21 рджрд┐рди рд╣реИред


рдХреНрдпреЛрдВрдХрд┐ рдореЗрдореЛрд░реА рдХрд╛ рдЖрдХрд╛рд░ рддрдп рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рд▓реЗрдЦрди рдФрд░ рд░реАрдб рдкреНрд░рджрд░реНрд╢рди рдореЗрдореЛрд░реА рдХреА рдЗрд╕ рд░рд╛рд╢рд┐ рддрдХ рд╕реАрдорд┐рдд рд░рд╣реЗрдЧрд╛ред PTSDB рдореЗрдореЛрд░реА рдХреА рдорд╛рддреНрд░рд╛ рдиреНрдпреВрдирддрдо рд╕рдордп рдЕрд╡рдзрд┐, рд╕рдВрдЧреНрд░рд╣ рдЕрд╡рдзрд┐ рдФрд░ рд╕рдордп рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддреА рд╣реИред


рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рд╣рд╛рдирд┐ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рд▓ рдореИрдХреЗрдирд┐рдЬреНрдо рднреА рд╣реИред


рдЖрдЧреЗ рд▓реЙрдЧ (рд╡рд╛рд▓) рд▓рд┐рдЦреЗрдВ рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕реНрдерд╛рдпреА рдорд╛рдзреНрдпрдо рдкрд░ рд╕рдВрдХрд▓рд┐рдд рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдХреНрд░рдордмрджреНрдз рдХрд░рддрд╛ рд╣реИред рд╡рд┐рдлрд▓рддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд▓реЙрдЧ рд╕реЗ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдЕрдкрдиреА рд╕реБрд╕рдВрдЧрдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд▓ рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ 128 рдПрдордмреА рд╕реЗрдЧрдореЗрдВрдЯ рдореЗрдВ рд╡реЙрд▓ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХрдЪреНрдЪрд╛ рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдЕрднреА рддрдХ рд╕рдВрдкреАрдбрд╝рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реЗ рдирд┐рдпрдорд┐рдд рдЯреБрдХрдбрд╝реЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рдмрдбрд╝реЗ рд╣реИрдВред


рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХрдо рд╕реЗ рдХрдо 3 рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЙрдЪреНрдЪ рдЯреНрд░реИрдлрд╝рд┐рдХ рд╡рд╛рд▓реЗ рд╕рд░реНрд╡рд░ рддреАрди рд╕реЗ рдЕрдзрд┐рдХ рд╡рд╛рд▓ рдлрд╛рдЗрд▓реЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рджреЛ рдШрдВрдЯреЗ рдХреЗ рдХрдЪреНрдЪреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред


рд╡рд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдбрд┐рд╕реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрдореА рд╣реИ рдХреЗрд╡рд▓ рдПрдХ рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдбрд┐рд╕реНрдХ рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдирд╣реАрдВ рдЬреЛ рдСрдкрд░реЗрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд▓рд┐рдЦреА рдЧрдИ рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓реЙрдЧ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рд▓рд╛рдЧрдд рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЯреБрдХрдбрд╝реЗ рд▓рд┐рдЦрдиреЗ рдХреА рд▓рд╛рдЧрдд рд╕реЗ рдмрд╣реБрдд рдХрдо рд╣реИред


рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдЖрд╡рдзрд┐рдХ рд╡рд┐рд░рд╛рдо рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдкрд┐рдЫрд▓реА рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рд▓реЙрдЧ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░рдХреЗ рдФрд░ рдбрд┐рд╕реНрдХ рдкрд░ рд╕рд╣реЗрдЬрдХрд░ рд╣рд░ 2 рдШрдВрдЯреЗ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред


рд╕рднреА рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рдЪреЗрдХрдкреЙрдЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╣реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдбреАрдбреА, рдЬрд╣рд╛рдВ рдбреАрдбреАрдбреА рдПрдХ рдиреАрд░рд╕ рд░реВрдк рд╕реЗ рдмрдврд╝рддреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрдХ рд╡рд┐рдлрд▓рддрд╛ рд╕реЗ рдЙрдмрд░рдиреЗ рдкрд░, рдпрд╣ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдХреИрдЯрд▓реЙрдЧ рд╕реЗ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рдХреЛ рдСрд░реНрдбрд░ рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ (.ddd)ред
рд╡рд╛рд▓ рд▓реЙрдЧ рд▓рд┐рдЦрдХрд░, рдЖрдк рдХрд┐рд╕реА рднреА рдЪреЗрдХрдкреЙрдЗрдВрдЯ рдкрд░ рд▓реМрдЯ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд▓реЙрдЧ рдЙрдкрд▓рдмреНрдз рд╣реИред


рдХреНрдпрд╛ рд╣реБрдЖ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ?


рдкреНрд░реЛрдЬреЗрдХреНрдЯ (.Net рдлреНрд░реЗрдорд╡рд░реНрдХ) рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рд╣рдордиреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Prometheus.Client.3.0.2 рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ред рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдореЗрдЯрд┐рдпрд╕ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рддрдХ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЗ рдФрд░ рдХрдХреНрд╖рд╛рдПрдВ рдЬреЛрдбрд╝реА рдЧрдИ рд╣реИрдВред


IMetricsService рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдХрд┐рддрдиреЗ рд╕рдордп рддрдХ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдорд░ рддрд░реАрдХреЗ рд╢рд╛рдорд┐рд▓ рдереЗ:


 public interface IMetricsService { Stopwatch StartTimer(); void StopTimer(Stopwatch timer, string controllerName, string actionName, string methodName = "POST"); } 

рд╣рдо рдореЗрдЯреНрд░рд┐рдХреНрд╕ рд╕рд░реНрд╡рд┐рд╕ рд╕реЗрд╡рд╛ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ IMetricsService рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореАрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред


 public class MetricsService : IMetricsService { private static Histogram _histogram; static MetricsService() { _histogram = CreateHistogram(); } public Stopwatch StartTimer() { try { var timer = new Stopwatch(); timer.Start(); return timer; } catch (Exception exception) { Logger.Error(exception); } return null; } public void StopTimer(Stopwatch timer, string controllerName, string actionName, string methodName = "POST") { try { if (timer == null) { throw new ArgumentException($"{nameof(timer)} can't be null."); } timer.Stop(); _histogram .WithLabels(controllerName, actionName, methodName) .Observe(timer.ElapsedMilliseconds, DateTimeOffset.UtcNow); } catch (Exception exception) { Logger.Error(exception); } } public static List<string> GetAllLabels() { var metricsList = new List<string>(); try { foreach (var keyValuePair in _histogram.Labelled) { var controllerName = keyValuePair.Key.Labels[0].Value; var actionName = keyValuePair.Key.Labels[1].Value; var methodName = keyValuePair.Key.Labels[2].Value; var requestDurationSum = keyValuePair.Value.Value.Sum; var requestCount = keyValuePair.Value.Value.Count; metricsList.Add($"http_request_duration_widget_sum{{controller={controllerName},action={actionName},method={methodName}}} {requestDurationSum}"); metricsList.Add($"http_request_duration_widget_count{{controller={controllerName},action={actionName},method={methodName}}} {requestCount}"); } _histogram = CreateHistogram(); } catch (Exception exception) { Logger.Error(exception); } return metricsList; } private static Histogram CreateHistogram() { var newMetrics = Metrics .WithCustomRegistry(new CollectorRegistry()) .CreateHistogram(name: "http_request_duration_web_api", help: "Histogram metrics of Web.Api", includeTimestamp: true, labelNames: new[] { "controller", "action", "method" }); var oldValue = _histogram; for (var i = 0; i < 10; i++) { var oldValue = Interlocked.Exchange<Histogram>(ref oldValue, newMetrics); if (oldValue != null) { return oldValue; } } return null; } } 

рдЕрдм рд╣рдо рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо Application_BeginRequest, Application_Error, Application_EndRequest рдХреЗ рддрд░реАрдХреЛрдВ рдореЗрдВ рдПрдХрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВред Global.cs рд╡рд░реНрдЧ рдореЗрдВ, рд╣рдо рдЙрдкрд░реЛрдХреНрдд рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред


 private IMetricsService _metricsService; protected virtual void Application_BeginRequest(object sender, EventArgs e) { var context = new HttpContextWrapper(HttpContext.Current); var metricServiceTimer = _metricsService.StartTimer(); context.Items.Add("metricsService", _metricsService); context.Items.Add("metricServiceTimer", metricServiceTimer); } protected virtual void Application_EndRequest(object sender, EventArgs e) { WriteMetrics(new HttpContextWrapper(HttpContext.Current)); } protected void Application_Error(object sender, EventArgs e) { WriteMetrics(new HttpContextWrapper(HttpContext.Current)); } private void WriteMetrics(HttpContextBase context) { try { _metricsService = context.Items["metricsService"] as IMetricsService; if (_metricsService != null) { var timer = context.Items["metricServiceTimer"] as Stopwatch; string controllerName = null; string actionName = null; var rd = RouteTable.Routes.GetRouteData(context); if (rd != null) { controllerName = rd.GetRequiredString("controller"); actionName = rd.GetRequiredString("action"); } _metricsService.StopTimer(timer, controllerName, actionName, context.Request.HttpMethod); } } catch (Exception exception) { Logger.Error("Can't write metrics.", exception); } } 

рдПрдХ рдирдпрд╛ рдирд┐рдпрдВрддреНрд░рдХ рдЬреЛрдбрд╝реЗрдВ, рдЬреЛ рд╣рдорд╛рд░реЗ рдПрдкреАрдЖрдИ рдХреЗ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджрд░реНрдн рдмрд┐рдВрджреБ рд╣реЛрдЧрд╛:


 public class MetricsController : Controller { [HttpGet] public string[] GetAllMetrics() { try { var metrics = MetricsService.GetAllLabels(); return metrics.ToArray(); } catch (Exception exception) { Logger.Error(exception); } return new string[] { }; } } 

рдЕрдВрддрд┐рдо рдЪрд░рдг рд╕реНрдХреНрд░реЗрдкреЗ_рдХреЙрдиреНрдлрд╝реНрд╕ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдореАрдЯреНрд░рд┐рдХ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдпрд╛ рдЧреНрд░рд╛рдлрд╛рдирд╛ рдпреВрдЖрдИ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХрддреНрд░рд┐рдд рдореИрдЯреНрд░рд┐рдХреНрд╕ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред


рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдореЗрдВ рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдЬреЛ рд╣рдо рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рдереЗ:


рдмрд╣реБрдЖрдпрд╛рдореА рдбреЗрдЯрд╛ рдореЙрдбрд▓: рдореИрдЯреНрд░рд┐рдХреНрд╕ рдФрд░ рд▓реЗрдмрд▓ред
рд▓рдЪреАрд▓реА PromQL рдХреНрд╡реЗрд░реА рднрд╛рд╖рд╛ред рдПрдХ рд╣реА рдХреНрд╡реЗрд░реА рдСрдкрд░реЗрдЯрд░ рдореЗрдВ, рд╣рдо рдХрдИ рдЧреБрдгрд╛, рдЬреЛрдбрд╝, рд╕рдВрдШрдирди рдЖрджрд┐ рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрдИ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкреБрд▓ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ HTTP- рдЖрдзрд╛рд░рд┐рдд рдбреЗрдЯрд╛ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддрд╛ рд╣реИред
рдкреБрд╢рдЧреЗрдЯрд╡реЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреБрд╢ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддред
рдирд┐рд░реНрдпрд╛рддрдХреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рд╕реЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдПрдХрддреНрд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред
рдбреЗрдЯрд╛ рд╣рд╛рдирд┐ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдбреЗрдЯрд╛ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЪрд┐рддреНрд░рдордп рдЕрднреНрдпрд╛рд╡реЗрджрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi475600/


All Articles