diff --git a/pghrep/src/fmtutils/utils.go b/pghrep/src/fmtutils/utils.go index 1ce484daf1c081ef56bc1f3e27505634567310a4..e415736eddcc9e57bd8f30ea932d1758519250d1 100644 --- a/pghrep/src/fmtutils/utils.go +++ b/pghrep/src/fmtutils/utils.go @@ -1,6 +1,7 @@ package fmtutils import ( + "bytes" "strings" "strconv" "math" @@ -118,4 +119,64 @@ func GetUnit(unit string) int64 { } value = intval * factor return value +} + +func RawIntFormat(v int64) string { + sign := "" + + // Min int64 can't be negated to a usable value, so it has to be special cased. + if v == math.MinInt64 { + return "-9,223,372,036,854,775,808" + } + + if v < 0 { + sign = "-" + v = 0 - v + } + + parts := []string{"", "", "", "", "", "", ""} + j := len(parts) - 1 + + for v > 999 { + parts[j] = strconv.FormatInt(v%1000, 10) + switch len(parts[j]) { + case 2: + parts[j] = "0" + parts[j] + case 1: + parts[j] = "00" + parts[j] + } + v = v / 1000 + j-- + } + parts[j] = strconv.Itoa(int(v)) + return sign + strings.Join(parts[j:], ",") +} + +func RawFloatFormat(v float64, precision int) string { + buf := &bytes.Buffer{} + if v < 0 { + buf.Write([]byte{'-'}) + v = 0 - v + } + + comma := []byte{','} + + parts := strings.Split(strconv.FormatFloat(v, 'f', precision, 64), ".") + pos := 0 + if len(parts[0])%3 != 0 { + pos += len(parts[0]) % 3 + buf.WriteString(parts[0][:pos]) + buf.Write(comma) + } + for ; pos < len(parts[0]); pos += 3 { + buf.WriteString(parts[0][pos : pos+3]) + buf.Write(comma) + } + buf.Truncate(buf.Len() - 1) + + if len(parts) > 1 { + buf.Write([]byte{'.'}) + buf.WriteString(parts[1]) + } + return buf.String() } \ No newline at end of file diff --git a/pghrep/src/main.go b/pghrep/src/main.go index e2b23b45dfd03fff393ebb81ed05870963ca5373..53de8fe3d2170af7d8fbc29f6e9aa897f6bcb03b 100644 --- a/pghrep/src/main.go +++ b/pghrep/src/main.go @@ -164,7 +164,9 @@ func loadTemplates() *template.Template { tplFuncMap["Mul"] = Mul tplFuncMap["Div"] = Div tplFuncMap["NumFormat"] = NumFormat + tplFuncMap["RawIntFormat"] = RawIntFormat tplFuncMap["MsFormat"] = MsFormat + tplFuncMap["RawFloatFormat"] = RawFloatFormat tplFuncMap["DtFormat"] = DtFormat templates, err = template.New("").Funcs(tplFuncMap).ParseFiles(allFiles...) if err != nil { diff --git a/pghrep/src/reportutils.go b/pghrep/src/reportutils.go index 1ec744390fa5f223d89dc4697f05d05f18e0b5d7..5d3e23a0f8b1fa1cc179eb1ed683cf8ecd8761a2 100644 --- a/pghrep/src/reportutils.go +++ b/pghrep/src/reportutils.go @@ -127,7 +127,7 @@ func Sub(a int, b int) int { func MsFormat(value interface{}) string { val := pyraconv.ToInt64(value) - tm, _ := time.ParseDuration(strconv.FormatInt(val, 10) + "ms") + tm, _ := time.ParseDuration(strconv.FormatInt(val, 10) + " ms") return tm.String() } @@ -149,4 +149,15 @@ func DtFormat(value interface{}) string { return t.String() } return val +} + +func RawIntFormat(value interface{}) string { + val := pyraconv.ToInt64(value) + return fmtutils.RawIntFormat(val) +} + +func RawFloatFormat(value interface{}, places interface{}) string { + val := pyraconv.ToFloat64(value) + pl := pyraconv.ToInt64(places) + return fmtutils.RawFloatFormat(val, int(pl)) } \ No newline at end of file diff --git a/pghrep/templates/K003.tpl b/pghrep/templates/K003.tpl index 066d5635e6cc62ef3e830a151e54939bff524718..44faf89a1c67a2f7d5e7315ccd018e143728ed17 100644 --- a/pghrep/templates/K003.tpl +++ b/pghrep/templates/K003.tpl @@ -16,19 +16,19 @@ Error (total time): {{ NumFormat (index (index (index .results .hosts.master) "d {{ range $i, $key := (index (index (index (index .results .hosts.master) "data") "queries") "_keys") }} {{- $value := (index (index (index (index $.results $.hosts.master) "data") "queries") $key) -}} {{- $key}} | -{{- NumFormat $value.diff_calls 2 }}
{{ NumFormat $value.per_sec_calls 2 }}/sec
{{ NumFormat $value.per_call_calls 2 }}/call
{{ NumFormat $value.ratio_calls 2 }}% | -{{- MsFormat $value.diff_total_time }}
{{ MsFormat $value.per_sec_total_time }}/sec
{{ MsFormat $value.per_call_total_time }}/call
{{ NumFormat $value.ratio_total_time 2 }}% | -{{- NumFormat $value.diff_rows 2 }}
{{ NumFormat $value.per_sec_rows 2 }}/sec
{{ NumFormat $value.per_call_rows 2 }}/call
{{ NumFormat $value.ratio_rows 2 }}% | -{{- NumFormat $value.diff_shared_blks_hit 2 }} blks
{{ NumFormat $value.per_sec_shared_blks_hit 2 }} blks/sec
{{ NumFormat $value.per_call_shared_blks_hit 2 }} blks/call
{{ NumFormat $value.ratio_shared_blks_hit 2 }}% | -{{- NumFormat $value.diff_shared_blks_read 2 }} blks
{{ NumFormat $value.per_sec_shared_blks_read 2 }} blks/sec
{{ NumFormat $value.per_call_shared_blks_read 2 }} blks/call
{{ NumFormat $value.ratio_shared_blks_read 2 }}% | -{{- NumFormat $value.diff_shared_blks_dirtied 2 }} blks
{{ NumFormat $value.per_sec_shared_blks_dirtied 2 }} blks/sec
{{ NumFormat $value.per_call_shared_blks_dirtied 2 }} blks/call
{{ NumFormat $value.ratio_shared_blks_dirtied 2 }}% | -{{- NumFormat $value.diff_shared_blks_written 2 }} blks
{{ NumFormat $value.per_sec_shared_blks_written 2 }} blks/sec
{{ NumFormat $value.per_call_shared_blks_written 2 }} blks/call
{{ NumFormat $value.ratio_shared_blks_written 2 }}% | -{{- MsFormat $value.diff_blk_read_time }}
{{ MsFormat $value.per_sec_blk_read_time }}/sec
{{ MsFormat $value.per_call_blk_read_time }}/call
{{ NumFormat $value.ratio_blk_read_time 2 }}% | -{{- MsFormat $value.diff_blk_write_time }}
{{ MsFormat $value.per_sec_blk_write_time }}/sec
{{ MsFormat $value.per_call_blk_write_time }}/call
{{ MsFormat $value.per_call_blk_write_time }}/call
{{ NumFormat $value.ratio_blk_write_time 2 }}% | +{{- RawIntFormat $value.diff_calls }}
{{ NumFormat $value.per_sec_calls 2 }}/sec
{{ NumFormat $value.per_call_calls 2 }}/call
{{ NumFormat $value.ratio_calls 2 }}% | +{{- RawFloatFormat $value.diff_total_time 2 }} ms
{{ MsFormat $value.per_sec_total_time }}/sec
{{ MsFormat $value.per_call_total_time }}/call
{{ NumFormat $value.ratio_total_time 2 }}% | +{{- RawIntFormat $value.diff_rows }}
{{ NumFormat $value.per_sec_rows 2 }}/sec
{{ NumFormat $value.per_call_rows 2 }}/call
{{ NumFormat $value.ratio_rows 2 }}% | +{{- RawIntFormat $value.diff_shared_blks_hit }} blks
{{ NumFormat $value.per_sec_shared_blks_hit 2 }} blks/sec
{{ NumFormat $value.per_call_shared_blks_hit 2 }} blks/call
{{ NumFormat $value.ratio_shared_blks_hit 2 }}% | +{{- RawIntFormat $value.diff_shared_blks_read }} blks
{{ NumFormat $value.per_sec_shared_blks_read 2 }} blks/sec
{{ NumFormat $value.per_call_shared_blks_read 2 }} blks/call
{{ NumFormat $value.ratio_shared_blks_read 2 }}% | +{{- RawIntFormat $value.diff_shared_blks_dirtied }} blks
{{ NumFormat $value.per_sec_shared_blks_dirtied 2 }} blks/sec
{{ NumFormat $value.per_call_shared_blks_dirtied 2 }} blks/call
{{ NumFormat $value.ratio_shared_blks_dirtied 2 }}% | +{{- RawIntFormat $value.diff_shared_blks_written }} blks
{{ NumFormat $value.per_sec_shared_blks_written 2 }} blks/sec
{{ NumFormat $value.per_call_shared_blks_written 2 }} blks/call
{{ NumFormat $value.ratio_shared_blks_written 2 }}% | +{{- RawFloatFormat $value.diff_blk_read_time 2 }} ms
{{ MsFormat $value.per_sec_blk_read_time }}/sec
{{ MsFormat $value.per_call_blk_read_time }}/call
{{ NumFormat $value.ratio_blk_read_time 2 }}% | +{{- RawFloatFormat $value.diff_blk_write_time 2 }} ms
{{ MsFormat $value.per_sec_blk_write_time }}/sec
{{ MsFormat $value.per_call_blk_write_time }}/call
{{ MsFormat $value.per_call_blk_write_time }}/call
{{ NumFormat $value.ratio_blk_write_time 2 }}% | {{- NumFormat $value.diff_kcache_reads 2 }} bytes
{{ NumFormat $value.per_sec_kcache_reads 2 }} bytes/sec
{{ NumFormat $value.per_call_kcache_reads 2 }} bytes/call
{{ NumFormat $value.ratio_kcache_reads 2 }}% | {{- NumFormat $value.diff_kcache_writes 2 }} bytes
{{ NumFormat $value.per_sec_kcache_writes 2 }} bytes/sec
{{ NumFormat $value.per_call_kcache_writes 2 }} bytes/call
{{ NumFormat $value.ratio_kcache_writes 2 }}% | -{{- MsFormat $value.diff_kcache_user_time_ms }}
{{ MsFormat $value.per_sec_kcache_user_time_ms }}/sec
{{ MsFormat $value.per_call_kcache_user_time_ms }}/call
{{ NumFormat $value.ratio_kcache_user_time_ms 2 }}% | -{{- MsFormat $value.diff_kcache_system_time_ms }}
{{ MsFormat $value.per_sec_kcache_system_time_ms }}/sec
{{ MsFormat $value.per_call_kcache_system_time_ms }}/call
{{ NumFormat $value.ratio_kcache_system_time_ms 2 }}% | +{{- RawFloatFormat $value.diff_kcache_user_time_ms 2 }} ms
{{ MsFormat $value.per_sec_kcache_user_time_ms }}/sec
{{ MsFormat $value.per_call_kcache_user_time_ms }}/call
{{ NumFormat $value.ratio_kcache_user_time_ms 2 }}% | +{{- RawFloatFormat $value.diff_kcache_system_time_ms 2 }} ms
{{ MsFormat $value.per_sec_kcache_system_time_ms }}/sec
{{ MsFormat $value.per_call_kcache_system_time_ms }}/call
{{ NumFormat $value.ratio_kcache_system_time_ms 2 }}% | {{- Nobr (LimitStr $value.query 2000 ) }} {{ end }}{{/* range */}} {{ else }}{{/* if .host.master*/}} @@ -50,19 +50,19 @@ Period age: {{ (index (index (index $.results $host) "data") "period_age") }} {{ range $i, $key := (index (index (index (index $.results $host) "data") "queries") "_keys") }} {{- $value := (index (index (index (index $.results $host) "data") "queries") $key) -}} {{- $key}} | -{{- NumFormat $value.diff_calls 2 }}
{{ NumFormat $value.per_sec_calls 2 }}/sec
{{ NumFormat $value.per_call_calls 2 }}/call
{{ NumFormat $value.ratio_calls 2 }}% | -{{- MsFormat $value.diff_total_time }}
{{ MsFormat $value.per_sec_total_time }}/sec
{{ MsFormat $value.per_call_total_time }}/call
{{ NumFormat $value.ratio_total_time 2 }}% | -{{- NumFormat $value.diff_rows 2 }}
{{ NumFormat $value.per_sec_rows 2 }}/sec
{{ NumFormat $value.per_call_rows 2 }}/call
{{ NumFormat $value.ratio_rows 2 }}% | -{{- NumFormat $value.diff_shared_blks_hit 2 }} blks
{{ NumFormat $value.per_sec_shared_blks_hit 2 }} blks/sec
{{ NumFormat $value.per_call_shared_blks_hit 2 }} blks/call
{{ NumFormat $value.ratio_shared_blks_hit 2 }}% | -{{- NumFormat $value.diff_shared_blks_read 2 }} blks
{{ NumFormat $value.per_sec_shared_blks_read 2 }} blks/sec
{{ NumFormat $value.per_call_shared_blks_read 2 }} blks/call
{{ NumFormat $value.ratio_shared_blks_read 2 }}% | -{{- NumFormat $value.diff_shared_blks_dirtied 2 }} blks
{{ NumFormat $value.per_sec_shared_blks_dirtied 2 }} blks/sec
{{ NumFormat $value.per_call_shared_blks_dirtied 2 }} blks/call
{{ NumFormat $value.ratio_shared_blks_dirtied 2 }}% | -{{- NumFormat $value.diff_shared_blks_written 2 }} blks
{{ NumFormat $value.per_sec_shared_blks_written 2 }} blks/sec
{{ NumFormat $value.per_call_shared_blks_written 2 }} blks/call
{{ NumFormat $value.ratio_shared_blks_written 2 }}% | -{{- MsFormat $value.diff_blk_read_time }}
{{ MsFormat $value.per_sec_blk_read_time }}/sec
{{ MsFormat $value.per_call_blk_read_time }}/call
{{ NumFormat $value.ratio_blk_read_time 2 }}% | -{{- MsFormat $value.diff_blk_write_time }}
{{ MsFormat $value.per_sec_blk_write_time }}/sec
{{ MsFormat $value.per_call_blk_write_time }}/call
{{ MsFormat $value.per_call_blk_write_time }}/call
{{ NumFormat $value.ratio_blk_write_time 2 }}% | +{{- RawIntFormat $value.diff_calls }}
{{ NumFormat $value.per_sec_calls 2 }}/sec
{{ NumFormat $value.per_call_calls 2 }}/call
{{ NumFormat $value.ratio_calls 2 }}% | +{{- RawFloatFormat $value.diff_total_time 2 }} ms
{{ MsFormat $value.per_sec_total_time }}/sec
{{ MsFormat $value.per_call_total_time }}/call
{{ NumFormat $value.ratio_total_time 2 }}% | +{{- RawIntFormat $value.diff_rows }}
{{ NumFormat $value.per_sec_rows 2 }}/sec
{{ NumFormat $value.per_call_rows 2 }}/call
{{ NumFormat $value.ratio_rows 2 }}% | +{{- RawIntFormat $value.diff_shared_blks_hit }} blks
{{ NumFormat $value.per_sec_shared_blks_hit 2 }} blks/sec
{{ NumFormat $value.per_call_shared_blks_hit 2 }} blks/call
{{ NumFormat $value.ratio_shared_blks_hit 2 }}% | +{{- RawIntFormat $value.diff_shared_blks_read }} blks
{{ NumFormat $value.per_sec_shared_blks_read 2 }} blks/sec
{{ NumFormat $value.per_call_shared_blks_read 2 }} blks/call
{{ NumFormat $value.ratio_shared_blks_read 2 }}% | +{{- RawIntFormat $value.diff_shared_blks_dirtied }} blks
{{ NumFormat $value.per_sec_shared_blks_dirtied 2 }} blks/sec
{{ NumFormat $value.per_call_shared_blks_dirtied 2 }} blks/call
{{ NumFormat $value.ratio_shared_blks_dirtied 2 }}% | +{{- RawIntFormat $value.diff_shared_blks_written }} blks
{{ NumFormat $value.per_sec_shared_blks_written 2 }} blks/sec
{{ NumFormat $value.per_call_shared_blks_written 2 }} blks/call
{{ NumFormat $value.ratio_shared_blks_written 2 }}% | +{{- RawFloatFormat $value.diff_blk_read_time 2 }} ms
{{ MsFormat $value.per_sec_blk_read_time }}/sec
{{ MsFormat $value.per_call_blk_read_time }}/call
{{ NumFormat $value.ratio_blk_read_time 2 }}% | +{{- RawFloatFormat $value.diff_blk_write_time 2 }} ms
{{ MsFormat $value.per_sec_blk_write_time }}/sec
{{ MsFormat $value.per_call_blk_write_time }}/call
{{ MsFormat $value.per_call_blk_write_time }}/call
{{ NumFormat $value.ratio_blk_write_time 2 }}% | {{- NumFormat $value.diff_kcache_reads 2 }} bytes
{{ NumFormat $value.per_sec_kcache_reads 2 }} bytes/sec
{{ NumFormat $value.per_call_kcache_reads 2 }} bytes/call
{{ NumFormat $value.ratio_kcache_reads 2 }}% | {{- NumFormat $value.diff_kcache_writes 2 }} bytes
{{ NumFormat $value.per_sec_kcache_writes 2 }} bytes/sec
{{ NumFormat $value.per_call_kcache_writes 2 }} bytes/call
{{ NumFormat $value.ratio_kcache_writes 2 }}% | -{{- MsFormat $value.diff_kcache_user_time_ms }}
{{ MsFormat $value.per_sec_kcache_user_time_ms }}/sec
{{ MsFormat $value.per_call_kcache_user_time_ms }}/call
{{ NumFormat $value.ratio_kcache_user_time_ms 2 }}% | -{{- MsFormat $value.diff_kcache_system_time_ms }}
{{ MsFormat $value.per_sec_kcache_system_time_ms }}/sec
{{ MsFormat $value.per_call_kcache_system_time_ms }}/call
{{ NumFormat $value.ratio_kcache_system_time_ms 2 }}% | +{{- RawFloatFormat $value.diff_kcache_user_time_ms 2 }} ms
{{ MsFormat $value.per_sec_kcache_user_time_ms }}/sec
{{ MsFormat $value.per_call_kcache_user_time_ms }}/call
{{ NumFormat $value.ratio_kcache_user_time_ms 2 }}% | +{{- RawFloatFormat $value.diff_kcache_system_time_ms 2 }} ms
{{ MsFormat $value.per_sec_kcache_system_time_ms }}/sec
{{ MsFormat $value.per_call_kcache_system_time_ms }}/call
{{ NumFormat $value.ratio_kcache_system_time_ms 2 }}% | {{- Nobr (LimitStr $value.query 2000 ) }} {{ end }}{{/* range */}} {{- else -}}{{/* if host data */}}