@@ -3,7 +3,6 @@ local fiber = require('fiber')
33local metrics = require (' metrics' )
44local checks = require (' checks' )
55local log = require (' log' )
6- local fun = require (' fun' )
76
87local graphite = {}
98
@@ -16,6 +15,30 @@ local DEFAULT_SEND_INTERVAL = 2
1615-- Constants
1716local LABELS_SEP = ' ;'
1817
18+ local GRAPHITE_FIBERS = {}
19+
20+ local function create_fiber_table (opts )
21+ local graphite_fiber = {}
22+
23+ if opts ~= nil then
24+ graphite_fiber .prefix = opts .prefix or DEFAULT_PREFIX
25+ graphite_fiber .host = opts .host or DEFAULT_HOST
26+ graphite_fiber .port = opts .port or DEFAULT_PORT
27+ graphite_fiber .send_interval = opts .send_interval or DEFAULT_SEND_INTERVAL
28+ graphite_fiber .name = ' metrics_graphite_worker' .. ' _' ..
29+ graphite_fiber .prefix .. ' _' .. graphite_fiber .host .. ' _' ..
30+ graphite_fiber .port .. ' _' .. graphite_fiber .send_interval
31+ else
32+ graphite_fiber .prefix = DEFAULT_PREFIX
33+ graphite_fiber .host = DEFAULT_HOST
34+ graphite_fiber .port = DEFAULT_PORT
35+ graphite_fiber .send_interval = DEFAULT_SEND_INTERVAL
36+ graphite_fiber .name = ' metrics_graphite_worker'
37+ end
38+
39+ return graphite_fiber
40+ end
41+
1942function graphite .format_observation (prefix , obs )
2043 local metric_path = # prefix > 0 and (' %s.%s' ):format (prefix , obs .metric_name ) or obs .metric_name
2144
@@ -36,41 +59,23 @@ function graphite.format_observation(prefix, obs)
3659 return graph
3760end
3861
39- local function create_fiber_name (opts )
40- local fiber_name
41-
42- if opts ~= nil then
43- local prefix = opts .prefix or DEFAULT_PREFIX
44- local host = opts .host or DEFAULT_HOST
45- local port = opts .port or DEFAULT_PORT
46- local send_interval = opts .send_interval or DEFAULT_SEND_INTERVAL
47-
48- fiber_name = ' metrics_graphite_worker' .. ' _' ..
49- prefix .. ' _' .. host .. ' _' .. port .. ' _' .. send_interval
50- else
51- fiber_name = ' metrics_graphite_worker'
52- end
53-
54- return fiber_name
55- end
56-
57- local function graphite_worker (opts )
58- fiber .name (create_fiber_name (opts ))
62+ local function graphite_worker (args )
63+ fiber .name (args .name )
5964
6065 while true do
6166 metrics .invoke_callbacks ()
6267 for _ , c in pairs (metrics .collectors ()) do
6368 for _ , obs in ipairs (c :collect ()) do
64- local data = graphite .format_observation (opts .prefix , obs )
65- local numbytes = opts .sock :sendto (opts .host , opts .port , data )
69+ local data = graphite .format_observation (args .prefix , obs )
70+ local numbytes = args .sock :sendto (args .host , args .port , data )
6671 if numbytes == nil then
6772 log .error (' Error while sending to host %s port %s data %s' ,
68- opts .host , opts .port , data )
73+ args .host , args .port , data )
6974 end
7075 end
7176 end
7277
73- fiber .sleep (opts .send_interval )
78+ fiber .sleep (args .send_interval )
7479 end
7580end
7681
@@ -82,25 +87,27 @@ function graphite.init(opts)
8287 send_interval = ' ?number'
8388 }
8489
90+ local graphite_fiber = create_fiber_table (opts )
91+
8592 local sock = socket (' AF_INET' , ' SOCK_DGRAM' , ' udp' )
8693 assert (sock ~= nil , ' Socket creation failed' )
8794
88- local prefix = opts .prefix or DEFAULT_PREFIX
89- local host = opts .host or DEFAULT_HOST
90- local port = opts .port or DEFAULT_PORT
91- local send_interval = opts .send_interval or DEFAULT_SEND_INTERVAL
92-
93- fun .iter (fiber .info ()):
94- filter (function (_ , x ) return x .name == create_fiber_name (opts ) end ):
95- each (function (x ) fiber .kill (x ) end )
95+ for _ , v in ipairs (GRAPHITE_FIBERS ) do
96+ if v .name == graphite_fiber .name then
97+ error (' failed to start fiber: ' .. graphite_fiber .name .. " , already exist" )
98+ end
99+ end
96100
97- fiber .create (graphite_worker , {
98- prefix = prefix ,
101+ graphite_fiber .fiber = fiber .create (graphite_worker , {
102+ name = graphite_fiber .name ,
103+ prefix = graphite_fiber .prefix ,
99104 sock = sock ,
100- host = host ,
101- port = port ,
102- send_interval = send_interval ,
105+ host = graphite_fiber . host ,
106+ port = graphite_fiber . port ,
107+ send_interval = graphite_fiber . send_interval ,
103108 })
109+
110+ table.insert (GRAPHITE_FIBERS , graphite_fiber )
104111end
105112
106113function graphite .stop (opts )
@@ -111,9 +118,16 @@ function graphite.stop(opts)
111118 send_interval = ' ?number'
112119 }
113120
114- fun .iter (fiber .info ()):
115- filter (function (_ , x ) return x .name == create_fiber_name (opts ) end ):
116- each (function (x ) fiber .kill (x ) end )
121+ local graphite_fiber = create_fiber_table (opts )
122+
123+ for _ , v in ipairs (GRAPHITE_FIBERS ) do
124+ if v .name == graphite_fiber .name then
125+ fiber .kill (v .fiber )
126+ return
127+ end
128+ end
129+
130+ error (" failed to stop fiber: " .. graphite_fiber .name .. " , doesn't exist" )
117131end
118132
119133return graphite
0 commit comments