Question: how to replace multi pattern
Closed this issue · 2 comments
keyboardfann commented
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
mcorbin commented
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 ;)
keyboardfann commented
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