Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Question: how to replace multi pattern #835

Closed
keyboardfann opened this issue Jul 13, 2017 · 2 comments
Closed

Question: how to replace multi pattern #835

keyboardfann opened this issue Jul 13, 2017 · 2 comments

Comments

@keyboardfann
Copy link

keyboardfann commented Jul 13, 2017

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
Copy link
Contributor

mcorbin commented Jul 15, 2017

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
Copy link
Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants