Prometheus: рдирд┐рдпрдо рд╕реНрд╡рд░реВрдкрдг рдЙрдкрдХрд░рдгред

рдХреЛ рдирд┐рд░реНрдорд┐рдд 4 рдЬрдире░ 2013  ┬╖  41рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: prometheus/prometheus

рдЧреЛ рдХреЗ рд▓рд┐рдП "gofmt" рдХреА рддрд░рд╣, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХреЗ рд▓рд┐рдП "promfmt" рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рд╣реИред рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рдгрд╛рд▓реА рдПрдХ рд╕рдорд╛рди рд╢реИрд▓реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреА рд╣реИ рдЬреЛ рд╡рд┐рдЪрд▓рди рдФрд░ рд╕реАрдЦрдиреЗ рдХреА рдЕрд╡рд╕реНрдерд╛ рдХреЛ рдХрдо рдХрд░рддреА рд╣реИред

YAML рдирд┐рдпрдо рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ : PromQL рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо PromQL рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдФрд░ YAML рдлрд╝рд╛рдЗрд▓ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП YAML рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

componenpromtool kinenhancement prioritP3

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

promfmt рдЯреВрд▓ рдХрд╛ рд╕рдВрдкреВрд░реНрдг рдмрд┐рдВрджреБ, рдпрджрд┐ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд "рдХреИрдиреЛрдирд┐рдХрд▓" рд╕реНрд╡рд░реВрдкрдг рдХрд╛ "рд╕рдорд░реНрдерди" рдХрд░рдирд╛ рд╣реИ, рдмрд╣реБрдд рдХреБрдЫ gofmt , рдЗрд╕рдХреЗ рдкреАрдЫреЗ рддрд░реНрдХреЛрдВ рдХреА рдПрдХ рдкреВрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рдеред

рд╕рднреА 41 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

:+1:* тАЛтАЛ:100:

рд╣рд╛рдБ, рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдмрдбрд╝реА (рдФрд░ рдореВрд▓ рд░реВрдк рд╕реЗ рдХреЗрд╡рд▓) рд╕рдорд╕реНрдпрд╛ рд╣реИред рдФрд░ рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рднрд╛рд╡реЛрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рд╕рд╣рдорддрд┐ред

рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ рдкреНрд░реЛрдордЯреВрд▓ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмреАрдЪ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ?

рд╕рдВрдмрдВрдзрд┐рдд: https://github.com/prometheus/prometheus/pull/1779

рдХреБрдЫ рдЕрд╡рд▓реЛрдХрди:

  • 2.x рдирд┐рдпрдо рдкреНрд░рд╛рд░реВрдк (YAML рдПрдореНрдмреЗрдбрд┐рдВрдЧ PromQL) рдХреЗ рд╕рд╛рде, рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ YAML рдлрд╝рд╛рдЗрд▓реЛрдВ рдкрд░ рднреА рдХрд╛рд░реНрдп рдХрд░реЗред
  • рдЗрд╕реЗ YAML рдФрд░ PromQL рдореЗрдВ рджреЛрдиреЛрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ (рди рдХреЗрд╡рд▓ рд▓рд╛рдЗрди рдмреНрд░реЗрдХ)ред
  • рдпрд╣ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдЗрдирдкреБрдЯ рдореЗрдВ рдХреБрдЫ рд▓рд╛рдЗрди рдмреНрд░реЗрдХ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП (cf. gofmt рдпрд╣ рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИ)ред
  • рдЬрд╣рд╛рдВ рдХрд╣реАрдВ рднреА рдПрдХ рдирд┐рдпрдо рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд╣реА рд╕реНрд╡рд░реВрдкрдг рд▓рд╛рдЧреВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рд╡реЗрдм UI рдХреЗ _Alerts_ рдФрд░ _Rules_ рдЯреИрдм рдкрд░ред рдЗрд╕рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ рдПрдПрд╕рдЯреА рдХреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд░рдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ (рдФрд░ рд╕рдВрднрд╡рддрдГ рдХреБрдЫ рд▓рд╛рдЗрди рдмреНрд░реЗрдХ, рдкрд┐рдЫрд▓рд╛ рдмрд┐рдВрджреБ рджреЗрдЦреЗрдВ)ред

рдЗрд╕реЗ YAML рдореЗрдВ рджреЛрдиреЛрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП

рд╣рдорд╛рд░реА рд╡рд░реНрддрдорд╛рди рд╡рд╛рдИрдПрдПрдордПрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди "рдЬрд▓реНрдж рд╣реА" рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣реА рд╣реИред

рдореИрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рдЬреАрдПрд╕рдУрд╕реА рдкреНрд░рд╕реНрддрд╛рд╡ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред @ рдмреНрд░рд╛рдпрди-рдмреНрд░рд╛рдЬрд╝реАрд▓, рдХреНрдпрд╛ рдЖрдк рдЙрд╕ рд╡рд╛рдИрдПрдПрдордПрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рд▓рд┐рдВрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдЖрдк рдЬрд┐рдХреНрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

https://github.com/go-yaml/yaml , рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдХреЗрд╡рд▓ PromQL рддрдХ рд╕реАрдорд┐рдд рдХрд░ рджреВрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЦрдбрд╝рд╛ рд╣реИред

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

рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рд╣рдореЗрдВ рд▓рд╛рдн рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдЬреАрдПрд╕рдУрд╕реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдЕрд╕реНрдкрд╖реНрдЯ рд╕рдордпрд░реЗрдЦрд╛ рд╡рд╛рд▓реА рдХрд┐рд╕реА рдЪреАрдЬ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ред

рдЖрдЗрдП PromQL рднрд╛рдЧ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреНрд╡рд╛рд░рд╛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ |2 рдорд▓реНрдЯреАрд▓рд╛рдЗрди рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рд╕рдВрдХреЗрдд рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж YAML рднрд╛рдЧ рд▓рдЧрднрдЧ рддреБрдЪреНрдЫ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдареАрдХ!

YAML рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ v3 рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЗрди рд╕рдм рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред

FYI рдХрд░реЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрдардиреАрдп рдирд┐рдпрдо

(
    kube_job_status_failed > 0
    UNLESS kube_job_status_succeeded > 0
)
* on (namespace, job_name) group_left(maintainer) label_replace(kube_job_labels, "maintainer", "$1", "label_maintainer", "(.*)")
* on (namespace, job_name) group_left(pager) label_replace(kube_job_labels, "pager", "$1", "label_pager", "(.*)")
* on (namespace, job_name) group_left(paging) label_replace(kube_job_labels, "paging", "$1", "label_paging", "(.*)")

рд╡реАрдПрд╕ рд╡реЗрдм рдпреВрдЖрдИ рдореЗрдВ рдЗрд╕рдХрд╛ рдХрдЪрд░рд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡

(kube_deployment_status_replicas_available
  / kube_deployment_spec_replicas * 100) * on(namespace, deployment) group_left(maintainer)
  label_replace(kube_deployment_labels, "maintainer", "$1", "label_maintainer",
  "(.*)") * on(namespace, deployment) group_left(pager) label_replace(kube_deployment_labels,
  "pager", "$1", "label_pager", "(.*)") * on(namespace,
  deployment) group_left(paging) label_replace(kube_deployment_labels, "paging",
  "$1", "label_paging", "(.*)") < 100

@sylr рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рд╡реЗрдм UI рд╕реЗ рдХреЛрдИ рдЕрдиреНрдп рдирд┐рдпрдо рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИред рднреА @beorn7 рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдпрд╣рд╛рдБ рдпрд╣ рдЖрдкрдХреЗ рдирд┐рдпрдо рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рд▓рд┐рдП рдХреНрдпрд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ:

(kube_job_status_failed
  > 0 unless kube_job_status_succeeded > 0) * on(namespace, job_name) group_left(maintainer)
  label_replace(kube_job_labels, "maintainer", "$1", "label_maintainer",
  "(.*)") * on(namespace, job_name) group_left(pager) label_replace(kube_job_labels,
  "pager", "$1", "label_pager", "(.*)") * on(namespace,
  job_name) group_left(paging) label_replace(kube_job_labels, "paging", "$1",
  "label_paging", "(.*)")

@geekodour рд╣рд╛рдВ, рдореИрдВрдиреЗ рджреЛ рдирд┐рдпрдореЛрдВ рдХреЛ рдорд┐рд▓рд╛рдпрд╛ рд╣реИред

рдЪреВрдВрдХрд┐ рдпрд╣ рдЕрднреА рднреА рдЦреБрд▓рд╛ рд╣реИ рдФрд░ рдЖрдЧрд╛рдореА рдЬреАрдПрд╕рдУрд╕реА рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡рд┐рдЪрд╛рд░реЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ (https://github.com/cncf/soc#rule-formatting-tool) рдореИрдВ рдЬреАрдПрд╕рдУрд╕реА рдХреЗ рджреМрд░рд╛рди рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╣рд╛рд▓рд┐рдпрд╛ рдЕрдкрдбреЗрдЯ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА @codesome @brian-brazil @juliusv @geekodour @simonpasquier @sylr рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреА ред
рдЯрд┐рдкреНрдкрдгреА рдФрд░ рдЕрдиреНрдп рд╕рдВрджрд░реНрдн рд▓рд┐рдВрдХ рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд▓реА рдХреНрд░рд┐рдпрд╛ рдмрд┐рдВрджреБ рдкреНрд░реЛрдордХреНрдпреВрдПрд▓ рдПрдПрд╕рдЯреА рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдордХреНрдпреВрдПрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдлреЙрд░реНрдореЗрдЯрд░ рдмрдирд╛ рд░рд╣рд╛ рд╣реИ?

@haibeey рдЙрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рдХреБрдЫ рдкреНрд░рдЧрддрд┐ рд╣реБрдИ рд╣реИред

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

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

рдареАрдХ рд╣реИ! рдзрдиреНрдпрд╡рд╛рдж @slrtbtfs ред рдореИрдВ ASAP рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рдХреЛ рд╕рдордЭрдирд╛ рд╢реБрд░реВ рдХрд░ рджреВрдВрдЧрд╛ред

рдХреНрдпрд╛ рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЙрдард╛ рд╕рдХрддрд╛ рд╣реВрдВ? рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗред

рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ рдХрд┐ @haibeey рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реИред

@roidelapluie рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдкрд╣рд▓реЗ рд╣реА рд▓рд╛рдЧреВ рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ред

FYI рдХрд░реЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрдардиреАрдп рдирд┐рдпрдо

(
    kube_job_status_failed > 0
    UNLESS kube_job_status_succeeded > 0
)
* on (namespace, job_name) group_left(maintainer) label_replace(kube_job_labels, "maintainer", "$1", "label_maintainer", "(.*)")
* on (namespace, job_name) group_left(pager) label_replace(kube_job_labels, "pager", "$1", "label_pager", "(.*)")
* on (namespace, job_name) group_left(paging) label_replace(kube_job_labels, "paging", "$1", "label_paging", "(.*)")

рд╡реАрдПрд╕ рд╡реЗрдм рдпреВрдЖрдИ рдореЗрдВ рдЗрд╕рдХрд╛ рдХрдЪрд░рд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡

(kube_deployment_status_replicas_available
  / kube_deployment_spec_replicas * 100) * on(namespace, deployment) group_left(maintainer)
  label_replace(kube_deployment_labels, "maintainer", "$1", "label_maintainer",
  "(.*)") * on(namespace, deployment) group_left(pager) label_replace(kube_deployment_labels,
  "pager", "$1", "label_pager", "(.*)") * on(namespace,
  deployment) group_left(paging) label_replace(kube_deployment_labels, "paging",
  "$1", "label_paging", "(.*)") < 100

рдХреНрдпрд╛ рдпрд╣ рд╕реНрд╡рд░реВрдкрдг рд╢реИрд▓реА рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ? @codesome @juliusv @brian-brazil @beorn7
рдореИрдВ рдЗрд╕ рд╢реИрд▓реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдирд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВред

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

https://prometheus.io/docs/practices/rules/ рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдореИрдВрдиреЗ goyacc рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдмрдврд╝рд╛рдХрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЛрдЯрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд▓рд┐рдЦрд╛ рдерд╛ред рдпрд╣рд╛рдВ рдкреНрд░рддрд┐рдмрджреНрдз рдХрд░реЗрдВ https://github.com/haibeey/prometheus/commit/885566786ac20bfd400b2e7db470c92545919690

рдирд┐рдпрдо рдлрд╝рд╛рдЗрд▓
рд╡реЗрдм рдпреВрдЖрдИ . рдореЗрдВ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдирд┐рдпрдо

рдпрд╣ рд╕рд╣реА рдирд╣реАрдВ рд▓рдЧрддрд╛, рдСрдкрд░реЗрдЯрд░ рдЕрдкрдиреА рд▓рд╛рдЗрди рдкрд░ рдирд╣реАрдВ рд╣реИрдВ

рдУрд╣ рд╣рд╛рдВред рд╡рд╣ рдкреНрд░рддрд┐рдмрджреНрдз рд╕реНрд╡рд░реВрдкрдг рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдореБрджреНрд░рдг рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рдмрд╛рдж promql expr рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред
рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рдмрд╛рдж рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред

рдореИрдВрдиреЗ goyacc рд╡реНрдпрд╛рдХрд░рдг рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдмрдврд╝рд╛рдХрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЛрдЯрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд▓рд┐рдЦрд╛ рдерд╛ред рдпрд╣рд╛рдБ рдХрдорд┐рдЯ рдХрд░реЗрдВ [haibee@8855667]

рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдПрдПрд╕рдЯреА рдореЗрдВ рд░рдЦрдирд╛ рдПрдХ рдЙрдЪрд┐рдд рд╡рд┐рдЪрд╛рд░ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИред

рдореИрдВрдиреЗ рд╡рд╣рд╛рдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдЫреЛрдбрд╝реА рд╣реИрдВред

https://prometheus.io/docs/practices/rules/ рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдХреГрдкрдпрд╛ рд▓рд╛рдЧреВ рди рдХрд░реЗрдВ:

sum without (instance)(instance_path:requests:rate5m{job="myjob"})

рдКрдкрд░

sum(instance_path:requests:rate5m{job="myjob"}) without (instance)

рд╕рдВрд╢реЛрдзрдХ рдХреЛ рдкрд╣рд▓реЗ рд╕рдореВрд╣рдмрджреНрдз рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИ, рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╣реИрдВ - рдЕрдиреНрдпрдерд╛ рдЧреИрд░-рддреБрдЪреНрдЫ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкрдврд╝рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

рд╣рд╛рдВ, рд╢реБрд░реВ рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рдордЬрдмреВрдд рд░рд╛рдп рдереАред рдкрд╣рд▓реЗ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдиреЗ рдХреЗрд╡рд▓ sum(x) by(y) рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдВрдЧреНрд░реЗрдЬреА рдХреА рддрд░рд╣ рдЕрдзрд┐рдХ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕реЗ рдмрд╣реБрдд рдкрд╕рдВрдж рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдЧреИрд░-рддреБрдЪреНрдЫ x рдпрд╣ рджреЗрдЦрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдард┐рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рди рдЖрдпрд╛рдореЛрдВ рдкрд░ рдПрдХрддреНрд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ / рд░рдЦрдирд╛ред рдХрд╛рд╢ рдореИрдВрдиреЗ рдЗрд╕реЗ рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА sum by(y) (x) рдмрдирд╛ рджрд┐рдпрд╛ рд╣реЛрддрд╛ рдФрд░ рдЗрд╕реЗ рдПрдХрдорд╛рддреНрд░ рдХрд╛рдиреВрдиреА рд░реВрдк рдмрдирд╛ рджрд┐рдпрд╛ рд╣реЛрддрд╛ред

рдореБрдЭреЗ рдЕрднреА рднреА рдмрд┐рд▓реНрдХреБрд▓ рд╕рдЯреАрдХ рд╕реНрд╡рд░реВрдкрдг sum by (y)(x) рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдФрд░ sum by(y) (x) (рдореЗрд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ) рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдордиреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреЗ рд▓рд┐рдП рдХреНрдпреЛрдВ рдЬрд╛рдирд╛ рдЪреБрдирд╛ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреА рд░рд╛рдп рдХрд╛ рд╣рдХрджрд╛рд░ рд╣реИ, рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ "рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕" рдХреЛ рдШреГрдгрд┐рдд рдорд╛рдирддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рд╕рднреА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛рдиреВрдиреА рд╣реИрдВ, рдХреГрдкрдпрд╛ рдПрдХ рдХреЛ рджреВрд╕рд░реЗ рдкрд░ рд▓рд╛рдЧреВ рди рдХрд░реЗрдВред

promfmt рдЯреВрд▓ рдХрд╛ рд╕рдВрдкреВрд░реНрдг рдмрд┐рдВрджреБ, рдпрджрд┐ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд "рдХреИрдиреЛрдирд┐рдХрд▓" рд╕реНрд╡рд░реВрдкрдг рдХрд╛ "рд╕рдорд░реНрдерди" рдХрд░рдирд╛ рд╣реИ, рдмрд╣реБрдд рдХреБрдЫ gofmt , рдЗрд╕рдХреЗ рдкреАрдЫреЗ рддрд░реНрдХреЛрдВ рдХреА рдПрдХ рдкреВрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рдеред

рд╣рд╛рдБ, gofmt рдХрд╛ рд╕реНрд╡рд░реВрдкрдг рдХрд┐рд╕реА рдХрд╛ рдкрд╕рдВрджреАрджрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдпрд╣ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реЛрдЧреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╕реБрд╕рдВрдЧрдд рд╢реИрд▓реА рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдореВрд▓реНрдп рд╣реИред

рдПрдХ рд╕рд╛рдЗрдб рдиреЛрдЯ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдЬреАрдПрд╕рдУрд╕реА рдХреЗ рд▓рд┐рдП рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдорд╛рдВрдЧрд╛ рдЧрдпрд╛ рд╣реИред @haibeey рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдЖрдк рднреА

рдирдИ go-yamlv3 рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХрдореЗрдВрдЯ рдкреНрд░рд┐рдЬрд░реНрд╡рд┐рдВрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерд┐рдд рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрддрдирд╛ рдирд┐рд░реНрджреЛрд╖ рд╣реИ рдХрд┐ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рдХреЛрдИ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЪрд┐рдВрддрд╛ рдХреЗ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХреЛрдб рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рддрдВрддреНрд░ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдареАрдХ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдЬреАрдПрд╕рдУрд╕реА рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдорд╕реМрджреЗ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред

рдЕрдВрддрд┐рдо рдорд╕реМрджреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рдореАрдХреНрд╖рд╛рдУрдВ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреАред рдзрдиреНрдпрд╡рд╛рдж

@ рд╣рд░рдХрд┐рд╢рди-рд╕рд┐рдВрд╣ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рджреЛ рд╕реНрддрд░ рд╣реИрдВ: рд╡рд╛рдИрдПрдПрдордПрд▓ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдФрд░ рдкреНрд░реЛрдордХреНрдпреВрдПрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рднреАрддрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВред https://github.com/prometheus/prometheus/issues/21#issuecomment -604213849 PromQL рд╡рд╛рд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛ (рд▓реЗрдХрд┐рди YAML рд╡рд╛рд▓реЗ рднреА рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреЗ рд╣реЛрдВрдЧреЗ)ред

рдирдИ go-yamlv3 рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХрдореЗрдВрдЯ рдкреНрд░рд┐рдЬрд░реНрд╡рд┐рдВрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерд┐рдд рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрддрдирд╛ рдирд┐рд░реНрджреЛрд╖ рд╣реИ рдХрд┐ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рдХреЛрдИ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЪрд┐рдВрддрд╛ рдХреЗ рдкреНрд░реЛрдореЗрдерд┐рдпрд╕ рдХреЛрдб рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рддрдВрддреНрд░ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

PromQL рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рджреМрд░рд╛рди рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЙрд╕ рдиреЗ рдХрд╣рд╛ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрд╡рд░реВрдкрдг рдХреЗрд╡рд▓ рдирд┐рдпрдореЛрдВ рдХреА рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╣реА рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдХреБрдЫ рдЬрдЧрд╣реЛрдВ рдкрд░ рд╡реЗрдм рдпреВрдЖрдИ рдХреА рддрд░рд╣ рднреА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рд╕рдЪ рд╣реИ @juliusv ?
рддреЛ рдЬреИрд╕рд╛ рдХрд┐ @slrtbtfs рджреНрд╡рд╛рд░рд╛ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ

рд╡рд╛рдИрдПрдПрдордПрд▓ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, v3 рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдХреЙрд░реНрдЯреЗрдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдХрд░ рд░рд╣реА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕рдХреЗ рдЖрдЧреЗ рд░реЛрд▓рдЖрдЙрдЯ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рд╕рдм рд╣рд▓ рди рд╣реЛ рдЬрд╛рдПред

рдЙрд╕ рдиреЗ рдХрд╣рд╛ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрд╡рд░реВрдкрдг рдХреЗрд╡рд▓ рдирд┐рдпрдореЛрдВ рдХреА рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╣реА рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдХреБрдЫ рдЬрдЧрд╣реЛрдВ рдкрд░ рд╡реЗрдм рдпреВрдЖрдИ рдХреА рддрд░рд╣ рднреА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рд╕рдЪ рд╣реИ

рд╡реЗрдм ui рдПрдХрдорд╛рддреНрд░ рдРрд╕рд╛ рд╕реНрдерд╛рди рд╣реИ рдЬреЛ рдЗрд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

cubranic picture cubranic  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

logemann picture logemann  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jutley picture jutley  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

juliusv picture juliusv  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mdlayher picture mdlayher  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ