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 */}}