/config/schema.go

https://github.com/lesovsky/pgcenter · Go · 166 lines · 135 code · 14 blank · 17 comment · 0 complexity · 0c7b3b27db94c981cc40b9baa5d995cd MD5 · raw file

  1. // pgCenter statistics schema.
  2. // Schema is deployed within pgCenter binary, but there is no things like 'go-bindata' or 'migrate'. pgCenter uses
  3. // simple approach to store schema definition - all functions' and views' bodies are stored in text constants and
  4. // organized in sequential set of SQL commands. At schema installation, this set of SQL commands is executed within single
  5. // transaction.
  6. package config
  7. const (
  8. // Name: pgcenter; Type: SCHEMA; Schema: -
  9. // The 'IF NOT EXISTS' clause isn't used because it's supported since 9.3.
  10. createSchemaSql = `CREATE SCHEMA pgcenter;`
  11. // Name: get_netdev_link_settings(character varying); Type: FUNCTION; Schema: pgcenter
  12. createProc1FunctionSql = `CREATE FUNCTION pgcenter.get_netdev_link_settings(INOUT iface CHARACTER VARYING, OUT speed BIGINT, OUT duplex INTEGER) RETURNS RECORD
  13. LANGUAGE plperlu
  14. AS $$
  15. use Linux::Ethtool::Settings;
  16. if (my $settings = Linux::Ethtool::Settings->new($_[0])) {
  17. my $if_speed = $settings->speed();
  18. my $if_duplex = $settings->duplex() ? 1 : 0;
  19. return {iface => $_[0], speed => $if_speed, duplex => $if_duplex};
  20. } else {
  21. return {iface => $_[0], speed => 0, duplex => -1};
  22. }
  23. $$;`
  24. // Name: get_sys_clk_ticks(); Type: FUNCTION; Schema: pgcenter
  25. createProc2FunctionSql = `CREATE FUNCTION pgcenter.get_sys_clk_ticks() RETURNS integer
  26. LANGUAGE plperlu
  27. AS $$
  28. use POSIX;
  29. $clock_ticks = POSIX::sysconf( &POSIX::_SC_CLK_TCK );
  30. return $clock_ticks;
  31. $$;`
  32. // Name: get_proc_stats(character varying, character varying, character varying, integer); Type: FUNCTION; Schema: pgcenter
  33. createProc3FunctionSql = `CREATE FUNCTION pgcenter.get_proc_stats(character varying, character varying, character varying, integer) RETURNS SETOF record
  34. LANGUAGE plperlu
  35. AS $$
  36. open FILE, $_[0];
  37. my @cntn = (); $i = 0;
  38. while (<FILE>) {
  39. # skip header if required.
  40. if ($i < $_[3]) { $i++; next; }
  41. chomp;
  42. my @items = map {s/^\s+|\s+$//g; $_;} split ($_[1]);
  43. my %iitems;
  44. # use filter if required.
  45. if ($items[0] =~ $_[2] && $_[2] ne "") {
  46. @iitems{map 'col'.$_, 0..$#items} = @items;
  47. push @cntn, \%iitems;
  48. } elsif ($_[2] eq "") {
  49. @iitems{map 'col'.$_, 0..$#items} = @items;
  50. push @cntn, \%iitems;
  51. }
  52. $i++
  53. }
  54. close FILE;
  55. return \@cntn;
  56. $$;`
  57. // Name: sys_proc_diskstats; Type: VIEW; Schema: pgcenter
  58. createView1Sql = `CREATE VIEW pgcenter.sys_proc_diskstats AS
  59. SELECT get_proc_stats.col0 AS maj,
  60. get_proc_stats.col1 AS min,
  61. get_proc_stats.col2 AS dev,
  62. get_proc_stats.col3 AS reads,
  63. get_proc_stats.col4 AS rmerges,
  64. get_proc_stats.col5 AS rsects,
  65. get_proc_stats.col6 AS rspent,
  66. get_proc_stats.col7 AS writes,
  67. get_proc_stats.col8 AS wmerges,
  68. get_proc_stats.col9 AS wsects,
  69. get_proc_stats.col10 AS wspent,
  70. get_proc_stats.col11 AS inprog,
  71. get_proc_stats.col12 AS spent,
  72. get_proc_stats.col13 AS weighted
  73. FROM pgcenter.get_proc_stats('/proc/diskstats'::character varying, ' '::character varying, ''::character varying, 0)
  74. AS (col0 integer, col1 integer, col2 character varying, col3 bigint, col4 bigint, col5 bigint, col6 bigint, col7 bigint, col8 bigint, col9 bigint, col10 bigint, col11 bigint, col12 bigint, col13 bigint);`
  75. // Name: sys_proc_loadavg; Type: VIEW; Schema: pgcenter
  76. createView2Sql = `CREATE VIEW pgcenter.sys_proc_loadavg AS
  77. SELECT get_proc_stats.col0 AS min1,
  78. get_proc_stats.col1 AS min5,
  79. get_proc_stats.col2 AS min15,
  80. get_proc_stats.col3 AS procnum,
  81. get_proc_stats.col4 AS last_pid
  82. FROM pgcenter.get_proc_stats('/proc/loadavg'::character varying, ' '::character varying, ''::character varying, 0)
  83. AS (col0 double precision, col1 double precision, col2 double precision, col3 character varying, col4 integer);`
  84. // Name: sys_proc_meminfo; Type: VIEW; Schema: pgcenter
  85. createView3Sql = `CREATE VIEW pgcenter.sys_proc_meminfo AS
  86. SELECT get_proc_stats.col0 AS metric,
  87. get_proc_stats.col1 AS metric_value,
  88. get_proc_stats.col2 AS unit
  89. FROM pgcenter.get_proc_stats('/proc/meminfo'::character varying, ' '::character varying, ''::character varying, 0)
  90. AS (col0 character varying, col1 bigint, col2 character varying);`
  91. // Name: sys_proc_netdev; Type: VIEW; Schema: pgcenter
  92. createView4Sql = `CREATE VIEW pgcenter.sys_proc_netdev AS
  93. SELECT get_proc_stats.col0 AS iface,
  94. get_proc_stats.col1 AS recv_bytes,
  95. get_proc_stats.col2 AS recv_pckts,
  96. get_proc_stats.col3 AS recv_err,
  97. get_proc_stats.col4 AS recv_drop,
  98. get_proc_stats.col5 AS recv_fifo,
  99. get_proc_stats.col6 AS recv_frame,
  100. get_proc_stats.col7 AS recv_cmpr,
  101. get_proc_stats.col8 AS recv_mcast,
  102. get_proc_stats.col9 AS sent_bytes,
  103. get_proc_stats.col10 AS sent_pckts,
  104. get_proc_stats.col11 AS sent_err,
  105. get_proc_stats.col12 AS sent_drop,
  106. get_proc_stats.col13 AS sent_fifo,
  107. get_proc_stats.col14 AS sent_colls,
  108. get_proc_stats.col15 AS sent_carrier,
  109. get_proc_stats.col16 AS sent_cmpr
  110. FROM pgcenter.get_proc_stats('/proc/net/dev'::character varying, ' '::character varying, ''::character varying, 2)
  111. AS (col0 character varying, col1 bigint, col2 bigint, col3 bigint, col4 bigint, col5 bigint, col6 bigint, col7 bigint, col8 bigint, col9 bigint, col10 bigint, col11 bigint, col12 bigint, col13 bigint, col14 bigint, col15 bigint, col16 bigint);`
  112. // Name: sys_proc_stat; Type: VIEW; Schema: pgcenter
  113. createView5Sql = `CREATE VIEW pgcenter.sys_proc_stat AS
  114. SELECT get_proc_stats.col0 AS cpu,
  115. get_proc_stats.col1 AS us_time,
  116. get_proc_stats.col2 AS ni_time,
  117. get_proc_stats.col3 AS sy_time,
  118. get_proc_stats.col4 AS id_time,
  119. get_proc_stats.col5 AS wa_time,
  120. get_proc_stats.col6 AS hi_time,
  121. get_proc_stats.col7 AS si_time,
  122. get_proc_stats.col8 AS st_time,
  123. get_proc_stats.col9 AS quest_time,
  124. get_proc_stats.col10 AS guest_ni_time
  125. FROM pgcenter.get_proc_stats('/proc/stat'::character varying, ' '::character varying, 'cpu'::character varying, 0)
  126. AS (col0 character varying, col1 bigint, col2 bigint, col3 bigint, col4 bigint, col5 bigint, col6 bigint, col7 bigint, col8 bigint, col9 bigint, col10 bigint);`
  127. // Name: sys_proc_uptime; Type: VIEW; Schema: pgcenter
  128. createView6Sql = `CREATE VIEW pgcenter.sys_proc_uptime AS
  129. SELECT get_proc_stats.col0 AS seconds_total,
  130. get_proc_stats.col1 AS seconds_idle
  131. FROM pgcenter.get_proc_stats('/proc/uptime'::character varying, ' '::character varying, ''::character varying, 0)
  132. AS (col0 numeric, col1 numeric);`
  133. // Name: pgcenter; Type: SCHEMA; Schema: -
  134. dropSchemaSql = `DROP SCHEMA pgcenter CASCADE;`
  135. )
  136. var (
  137. createSchemaSqlSet = []string{
  138. createSchemaSql,
  139. createProc1FunctionSql,
  140. createProc2FunctionSql,
  141. createProc3FunctionSql,
  142. createView1Sql,
  143. createView2Sql,
  144. createView3Sql,
  145. createView4Sql,
  146. createView5Sql,
  147. createView6Sql,
  148. }
  149. dropSchemaSqlSet = []string{
  150. dropSchemaSql,
  151. }
  152. )