PostgreSQL: PipelineDB - рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдХреЗ рд╕рдордЧреНрд░ рдкреНрд░рд╢реНрди

рдХреНрдпрд╛ рдХрднреА рдЖрдкрдХреЛ рдкрд┐рдЫрд▓реЗ рдорд╣реАрдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреА рдорд╛рддреНрд░рд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХреБрдЫ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдореВрд╣рдмрджреНрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рджрд┐рди / рдШрдВрдЯреЗ рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ?
рдпрджрд┐ рд╣рд╛рдБ - рддреЛ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд▓реНрдкрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИ, рдХреЗрд╡рд▓ рдмрджрддрд░

SELECT hour(datetime), somename, count(*), sum(somemetric) from table where datetime > :monthAgo group by 1, 2 order by 1 desc, 2 

рд╕рдордп-рд╕рдордп рдкрд░, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд┐рдзрддрд╛ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд▓рдЧрддреА рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рдПрдХ рдмрд╛рд░ рд╕рд╣рди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЕрдкреАрд▓ рдЖрдПрдЧреАред

рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрд░реЛрдз рдмреБрд░реЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рд╕рд┐рд╕реНрдЯрдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрддрдирд╛ рдбреЗрдЯрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рдХреГрддрд┐ рднреА рджрдпрд╛ (рдФрд░ рдЗрд╕рдХрд╛ рд╕рдордп) рд╣реЛрдЧреАред

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╕реАрдзреЗ PostgreSQL рдореЗрдВ рдЖрдк рдПрдХ рджреГрд╢реНрдп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдордХреНрдЦреА рд╕реАрдзреЗ рдКрдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╕реАрдзреЗ рд╕рдорд╛рди рдХреНрд╡реЗрд░реА рдореЗрдВ рдирдП рдЖрдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдЧреА?

рддреЛ - рдпрд╣ PipelineDB рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ

рдЙрдирдХреА рд╕рд╛рдЗрдЯ рд╕реЗ рдбреЗрдореЛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ


PipelineDB рдкрд╣рд▓реЗ рдПрдХ рдЕрд▓рдЧ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдереА, рд▓реЗрдХрд┐рди рдЕрдм PG 10.1 рдФрд░ рдЙрдЪреНрдЪрддрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред

рдФрд░ рдпрджреНрдпрдкрд┐ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдЕрд╡рд╕рд░ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЕрдиреНрдп рдЙрддреНрдкрд╛рджреЛрдВ рдореЗрдВ рдореМрдЬреВрдж рд╣реИрдВ, рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдХреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВ, PipelineDB рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд▓рд╕ рд╣реИ: рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдо рдкреНрд░рд╡реЗрд╢ рд╕реАрдорд╛ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА SQL рдЬрд╛рдирддреЗ рд╣реИрдВ)ред

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

рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЙрдирдХреЗ рдкрд╛рд╕ рдЕрдЪреНрдЫреЗ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рд╡реНрдпрд╡рд╕рд╛рдп рдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдХреИрд╕реЗ рдЖрдЬрдорд╛рдпрд╛ рдЬрд╛рдП рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЧреНрд░рд╛рдлреНрдЯрд╛рдирд╛ рдореЗрдВ рд▓рд╛рдпрд╛ рдЬрд╛рдПред

рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рдХреЛ рдЦрд░рд╛рдм рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╕рдм рдХреБрдЫ рдбреЙрдХрдЯрд░ рдореЗрдВ рддреИрдирд╛рдд рдХрд░рддрд╛ рд╣реВрдВред
рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рдЫрд╡рд┐рдпрд╛рдБ: postgres:latest , grafana/grafana

Postgres рдкрд░ PipelineDB рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рдХреЗ рд╕рд╛рде рдПрдХ рдорд╢реАрди рдкрд░, рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:

  1. apt update
  2. apt install curl
  3. curl -s http://download.pipelinedb.com/apt.sh | bash
  4. apt install pipelinedb-postgresql-11
  5. cd /var/lib/postgresql/data
  6. рдХрд┐рд╕реА рднреА рд╕рдВрдкрд╛рджрдХ рдореЗрдВ postgresql.conf рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ
  7. shared_preload_libraries рдХреБрдВрдЬреА рдХреЛ рдвреВрдВрдвреЗрдВ, рдЕрдирдкреНрд▓рдЧ рдХрд░реЗрдВ рдФрд░ pipelinedb рдорд╛рди рд╕реЗрдЯ рдХрд░реЗрдВ
  8. рдореБрдЦреНрдп max_worker_processes 128 рдкрд░ рд╕реЗрдЯ (рдЕрдиреБрд╢рдВрд╕рд╛ рдбреЙрдХ)
  9. рд░рд┐рдмреВрдЯ рд╕рд░реНрд╡рд░

PipelineDB рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░реАрдо рдФрд░ рджреГрд╢реНрдп рдмрдирд╛рдирд╛


рд░реАрдмреВрдЯ рдкреАрдЬреА рдХреЗ рдмрд╛рдж - рд▓реЙрдЧ рджреЗрдЦреЗрдВ рддрд╛рдХрд┐ рдРрд╕рд╛ рдХреБрдЫ рд╣реЛ


  1. рд╡рд╣ рдбреЗрдЯрд╛рдмреЗрд╕ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ: CREATE DATABASE testpipe;
  2. рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрдирд╛рдирд╛: CREATE EXTENSION pipelinedb;
  3. рдЕрдм рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдПрдХ рдзрд╛рд░рд╛ рдмрдирд╛ рд░рд╣реА рд╣реИред рдпрд╣ рдЗрд╕рдореЗрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЖрдЧреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

     CREATE FOREIGN TABLE flow_stream ( dtmsk timestamp without time zone, action text, duration smallint ) SERVER pipelinedb; 

    рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЖрдк рдЗрд╕ рдзрд╛рд░рд╛ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рдзрд╛рд░рдг select рд╕рд╛рде рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ - рдЖрдкрдХреЛ рдПрдХ рджреГрд╢реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
  4. рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕реЗ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП:

     CREATE VIEW viewflow WITH (ttl = '3 month', ttl_column = 'm') AS select minute(dtmsk) m, action, count(*), avg(duration)::smallint, min(duration), max(duration) from flow_stream group by 1, 2; 

    рдЙрдиреНрд╣реЗрдВ рдХрдВрдЯреАрдиреНрдпреВрдЕрд╕ рд╡реНрдпреВрдЬрд╝ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рднреМрддрд┐рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рд░рд╛рдЬреНрдп рдХреЗ рд╕рдВрд░рдХреНрд╖рдг рдХреЗ рд╕рд╛рдеред

    WITH рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред

    рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, ttl = '3 month' рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдкрд┐рдЫрд▓реЗ 3 рдорд╣реАрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдХреЙрд▓рдо M рд╕реЗ рджрд┐рдирд╛рдВрдХ / рд╕рдордп рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ M рдкреГрд╖реНрдарднреВрдорд┐ reaper рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрдкреНрд░рдЪрд▓рд┐рдд рдбреЗрдЯрд╛ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрддреА рд╣реИред

    рдЬреЛ рд▓реЛрдЧ рдЬрд╛рдирддреЗ рдирд╣реАрдВ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП minute рдлрд╝рдВрдХреНрд╢рди рд╕реЗрдХрдВрдб рдХреЗ рдмрд┐рдирд╛ рджрд┐рдирд╛рдВрдХ / рд╕рдордп рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдорд┐рдирдЯ рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдШрдЯрдирд╛рдУрдВ рдХреЗ рдПрдХрддреНрд░реАрдХрд░рдг рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рд╣реА рд╕рдордп рд╣реЛрдЧрд╛ред
  5. рдРрд╕рд╛ рджреГрд╢реНрдп рд▓рдЧрднрдЧ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдмрд╣реБрдд рд╕рд╛рд░рд╛ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдирдореВрдиреЗ рдХреЗ рд▓рд┐рдП рддрд╛рд░реАрдЦ рддрдХ рд╕реВрдЪрдХрд╛рдВрдХ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛

     create index on viewflow (m desc, action); 

PipelineDB рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


рдпрд╛рдж рд░рдЦреЗрдВ: рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдбреЗрдЯрд╛ рдбрд╛рд▓реЗрдВ, рдФрд░ рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рджреГрд╢реНрдп рд╕реЗ рдкрдврд╝реЗрдВ

 insert into flow_stream VALUES (now(), 'act1', 21); insert into flow_stream VALUES (now(), 'act2', 33); select * from viewflow order by m desc, action limit 4; select now() 

рдореИрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрдиреБрд░реЛрдз рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ

рдкрд╣рд▓реЗ рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ 46 рд╡реЗрдВ рдорд┐рдирдЯ рдореЗрдВ рдбреЗрдЯрд╛ рдХреИрд╕реЗ рдмрджрд▓рддрд╛ рд╣реИ
рдЬреИрд╕реЗ рд╣реА 47 рд╡рд╛рдБ рдЖрддрд╛ рд╣реИ, рдкрд╣рд▓реЗ рд╡рд╛рд▓рд╛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЪрд╛рд▓реВ рдорд┐рдирдЯ рдЯрд┐рдХрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред

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



рдореИрдВ рдЗрд╕реЗ рдЬрд╛рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдкрдХрд╛ рдбреЗрдЯрд╛ рдХреИрд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ

C # рдИрд╡реЗрдВрдЯ рдЬреЗрдирд░реЗрдЯрд░
 using Npgsql; using System; using System.Threading; namespace PipelineDbLogGenerator { class Program { private static Random _rnd = new Random(); private static string[] _actions = new string[] { "foo", "bar", "yep", "goal", "ano" }; static void Main(string[] args) { var connString = "Host=localhost;port=5432;Username=postgres;Database=testpipe"; using (var conn = new NpgsqlConnection(connString)) { conn.Open(); while (true) { var dt = DateTime.UtcNow; using (var cmd = new NpgsqlCommand()) { var act = GetAction(); cmd.Connection = conn; cmd.CommandText = "INSERT INTO flow_stream VALUES (@dtmsk, @action, @duration)"; cmd.Parameters.AddWithValue("dtmsk", dt); cmd.Parameters.AddWithValue("action", act); cmd.Parameters.AddWithValue("duration", GetDuration(act)); var res = cmd.ExecuteNonQuery(); Console.WriteLine($"{res} {dt}"); } Thread.Sleep(_rnd.Next(50, 230)); } } } private static int GetDuration(string act) { var c = 0; for (int i = 0; i < act.Length; i++) { c += act[i]; } return _rnd.Next(c); } private static string GetAction() { return _actions[_rnd.Next(_actions.Length)]; } } } 


рдЧреБрд░рд╛рдлрдирд╛ рдореЗрдВ рдирд┐рд╖реНрдХрд░реНрд╖


рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдЬ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрдЪрд┐рдд рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:



рдПрдХ рдирдпрд╛ рдбреИрд╢рдмреЛрд░реНрдб рдмрдирд╛рдПрдВ рдФрд░ рдЙрд╕рдореЗрдВ рдЧреНрд░рд╛рдлрд╝ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдкреИрдирд▓ рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдЖрдкрдХреЛ рдкреИрдирд▓ рдХреЗ рд╕рдВрдкрд╛рджрди рдореЗрдВ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:



рдЕрдЧрд▓рд╛ - рдПрдХ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, sql- рдХреНрд╡реЗрд░реА рд▓реЗрдЦрди рдореЛрдб рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рджрд░реНрдЬ рдХрд░реЗрдВ:

 select m as time, -- Grafana   time count, action from viewflow where $__timeFilter(m) --  ,     ,   col between :startdate and :enddate order by m desc, action; 

рдФрд░ рдлрд┐рд░ рдЖрдкрдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╢реЗрдбреНрдпреВрд▓ рдорд┐рд▓рддрд╛ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрджрд┐ рдЖрдкрдиреЗ рдЗрд╡реЗрдВрдЯ рдЬрдирд░реЗрдЯрд░ рд╢реБрд░реВ рдХрд┐рдпрд╛



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

рдПрдХрд╛рдзрд┐рдХ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдорд╛рди рд▓реАрдЬрд┐рдП рдореИрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдкреНрд░рддрд┐рд╢рдд рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рддрдиреЗ рдПрдкреА рддрд░реАрдХреЗ рд╣реИрдВ

 CREATE VIEW viewflow_per WITH (ttl = '3 d', ttl_column = 'm') AS select minute(dtmsk) m, action, percentile_cont(0.50) WITHIN GROUP (ORDER BY duration)::smallint p50, percentile_cont(0.95) WITHIN GROUP (ORDER BY duration)::smallint p95, percentile_cont(0.99) WITHIN GROUP (ORDER BY duration)::smallint p99 from flow_stream group by 1, 2; create index on viewflow_per (m desc); 

рдореИрдВ рдЧреНрд░рд╛рдлреНрдЯрд╛рдирд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдЪрд╛рд▓ рд╣реИ рдФрд░ рдорд┐рд▓рддрд╛ рд╣реИ:


рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдмрд╛рдд рдХрд╛рдо рдХрд░ рд░рд╣реА рд╣реИ, рдпрд╣ рд╢рд┐рдХрд╛рдпрддреЛрдВ рдХреЗ рдмрд┐рдирд╛, рдЕрдЪреНрдЫрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдбреЙрдХрдЯрд░ рдХреЗ рддрд╣рдд, рд╕рдВрдЧреНрд░рд╣ (2.3 рдЬреАрдмреА) рдореЗрдВ рдЙрдирдХреЗ рдбреЗрдореЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рд▓рдВрдмрд╛ рд╣реЛ рдЧрдпрд╛ред

рдореИрдВ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - рдореИрдВрдиреЗ рддрдирд╛рд╡ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ред

рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ

рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИ


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


All Articles