riemann/riemann

Question: how to replace multi pattern

Closed this issue · 2 comments

When I use string replace, seems the last pattern valid. I want to replace / to "." and replace "/value" to "". How do I have multi patterns to replace the string.

My expect Result:

stats_counts.MGS_fanntest.fanntest1
stats.gauges.MGS_fanntest.fanntest1
stats.timers.MGS_fanntest.fanntest1.90_percentile
stats.timers.MGS_fanntest.fanntest1.count
stats.timers.MGS_fanntest.fanntest1.lower
stats.timers.MGS_fanntest.fanntest1.mean
stats.timers.MGS_fanntest.fanntest1.stddev
stats.timers.MGS_fanntest.fanntest1.upper

replace / to "."
riemann.conf

; Parse field and rename field
(defn graphite-path-graphite
  "Constructs a path for an event. Takes the hostname fqdn, reversed,
              followed by the service, with spaces converted to dots."
  [event]
  (let [;; replace /value by "" , replace all "/" by "." in service
        service (clojure.string/replace (:service event) #"/" ".")
;        service (clojure.string/replace (:service event) #"/value" "")
;        service (clojure.string/replace (:service event) #"/90_percentile" ".90_percentile")
;        service (clojure.string/replace (:service event) #"/count" ".count")
;        service (clojure.string/replace (:service event) #"/lower" ".lower")
;        service (clojure.string/replace (:service event) #"/mean" ".mean")
;        service (clojure.string/replace (:service event) #"/stddev" ".stddev")
;        service (clojure.string/replace (:service event) #"/upper" ".upper")
        ;; returns the statd metric type using :metric_type value
        metric-type (condp = (:metric_type event)
                      "counter" "stats_counts"
                      "gauge"  "stats.gauges"
                      "timing" "stats.timers"
                      "set"    "stats.sets"
                )]
    (str metric-type "." service)))

; Generate Graphite format
(defn converts-to-graphite
  [event]
  (str (clojure.string/join " " [(graphite-path-graphite event)
                                 (riemann.graphite/graphite-metric event)
                                 (int (:time event))])
   ))


test data, statsd format:

echo "MGS_fanntest.fanntest1:100|c" | nc -w 1 -u 10.62.4.232 12000
echo "MGS_fanntest.fanntest1:100|g" | nc -w 1 -u 10.62.4.232 12000
echo "MGS_fanntest.fanntest1:100|ms|@0.1" | nc -w 1 -u 10.62.4.232 12000

Result:

stats_counts.MGS_fanntest.fanntest1.value
stats.gauges.MGS_fanntest.fanntest1.value
stats.timers.MGS_fanntest.fanntest1.90_percentile
stats.timers.MGS_fanntest.fanntest1.count
stats.timers.MGS_fanntest.fanntest1.lower
stats.timers.MGS_fanntest.fanntest1.mean
stats.timers.MGS_fanntest.fanntest1.stddev
stats.timers.MGS_fanntest.fanntest1.upper

replace / to ".", and want to replace "/value" to ""
riemann.conf

; Parse field and rename field
(defn graphite-path-graphite
  "Constructs a path for an event. Takes the hostname fqdn, reversed,
              followed by the service, with spaces converted to dots."
  [event]
  (let [;; replace /value by "" , replace all "/" by "." in service
        service (clojure.string/replace (:service event) #"/" ".")
        service (clojure.string/replace (:service event) #"/value" "")
;        service (clojure.string/replace (:service event) #"/90_percentile" ".90_percentile")
;        service (clojure.string/replace (:service event) #"/count" ".count")
;        service (clojure.string/replace (:service event) #"/lower" ".lower")
;        service (clojure.string/replace (:service event) #"/mean" ".mean")
;        service (clojure.string/replace (:service event) #"/stddev" ".stddev")
;        service (clojure.string/replace (:service event) #"/upper" ".upper")
        ;; returns the statd metric type using :metric_type value
        metric-type (condp = (:metric_type event)
                      "counter" "stats_counts"
                      "gauge"  "stats.gauges"
                      "timing" "stats.timers"
                      "set"    "stats.sets"
                )]
    (str metric-type "." service)))

; Generate Graphite format
(defn converts-to-graphite
  [event]
  (str (clojure.string/join " " [(graphite-path-graphite event)
                                 (riemann.graphite/graphite-metric event)
                                 (int (:time event))])
   ))
'''

test data, statsd format:

echo "MGS_fanntest.fanntest1:100|c" | nc -w 1 -u 10.62.4.232 12000
echo "MGS_fanntest.fanntest1:100|g" | nc -w 1 -u 10.62.4.232 12000
echo "MGS_fanntest.fanntest1:100|ms|@0.1" | nc -w 1 -u 10.62.4.232 12000

Result:

stats_counts.MGS_fanntest.fanntest1
stats.gauges.MGS_fanntest.fanntest1
stats.timers.MGS_fanntest.fanntest1-90_percentile
stats.timers.MGS_fanntest.fanntest1-count
stats.timers.MGS_fanntest.fanntest1-lower
stats.timers.MGS_fanntest.fanntest1-mean
stats.timers.MGS_fanntest.fanntest1-stddev
stats.timers.MGS_fanntest.fanntest1-upper

When you do

        service (clojure.string/replace (:service event) #"/" ".")
        service (clojure.string/replace (:service event) #"/value" "")

service will always be the result of (clojure.string/replace (:service event) #"/value" "").

Try to do instead something like:

        service (clojure.string/replace (:service event) #"/value" "")
        service (clojure.string/replace service #"/" ".")

I invert the 2 regex because you don't want to have ".value".

You can also probably do

        service (-> (clojure.string/replace (:service event) #"/value" "")
                    (clojure.string/replace #"/" "."))

Or do it in one regex ;)

Dear @mcorbin,
After change to the following setting , everything look good. Thank you for the answer.

  (let [;; replace /value by "" , replace all "/" by "." in service
        service (-> (clojure.string/replace (:service event) #"/value" "")
                    (clojure.string/replace #"/lower" ".lower")
                    (clojure.string/replace #"/count" ".count")
                    (clojure.string/replace #"/90_percentile" ".90_percentile")
                    (clojure.string/replace #"/mean" ".mean")
                    (clojure.string/replace #"/stddev" ".stddev")
                    (clojure.string/replace #"/upper" ".upper")
         )  

Test command

[root@tng1524 ~]# date;echo "MGS_fanntest.fanntest1:100|ms|@0.1" | nc -w 1 -u x.x.x.x 12000
Mon Jul 17 10:25:50 CST 2017
[root@tng1524 ~]# date;echo "MGS_fanntest.fanntest1:100|g" | nc -w 1 -u x.x.x.x 12000
Mon Jul 17 10:28:50 CST 2017
[root@tng1524 ~]# date;echo "MGS_fanntest.fanntest1:100|c" | nc -w 1 -u x.x.x.x 12000
Mon Jul 17 10:28:53 CST 2017

Result
image