33import instana .log as l
44import resource
55import os
6+ import gc
7+ import sys
68
79class Snapshot (object ):
810 name = None
11+ version = None
912 rlimit_core = (0 , 0 )
1013 rlimit_cpu = (0 , 0 )
1114 rlimit_fsize = (0 , 0 )
@@ -16,6 +19,18 @@ class Snapshot(object):
1619 rlimit_nofile = (0 , 0 )
1720 rlimit_memlock = (0 , 0 )
1821 rlimit_as = (0 , 0 )
22+ versions = None
23+
24+ def __init__ (self , ** kwds ):
25+ self .__dict__ .update (kwds )
26+
27+ class GC (object ):
28+ collect0 = 0
29+ collect1 = 0
30+ collect2 = 0
31+ threshold0 = 0
32+ threshold1 = 0
33+ threshold2 = 0
1934
2035 def __init__ (self , ** kwds ):
2136 self .__dict__ .update (kwds )
@@ -37,6 +52,7 @@ class Metrics(object):
3752 ru_nsignals = 0
3853 ru_nvcs = 0
3954 ru_nivcsw = 0
55+ gc = None
4056
4157 def __init__ (self , ** kwds ):
4258 self .__dict__ .update (kwds )
@@ -54,6 +70,7 @@ class Meter(object):
5470 snapshot_countdown = 1
5571 sensor = None
5672 last_usage = None
73+ last_collect = None
5774
5875 def __init__ (self , sensor ):
5976 self .sensor = sensor
@@ -80,6 +97,7 @@ def process(self):
8097
8198 def collect_snapshot (self ):
8299 s = Snapshot (name = self .sensor .service_name ,
100+ version = sys .version ,
83101 rlimit_core = resource .getrlimit (resource .RLIMIT_CORE ),
84102 rlimit_cpu = resource .getrlimit (resource .RLIMIT_CPU ),
85103 rlimit_fsize = resource .getrlimit (resource .RLIMIT_FSIZE ),
@@ -89,12 +107,40 @@ def collect_snapshot(self):
89107 rlimit_nproc = resource .getrlimit (resource .RLIMIT_NPROC ),
90108 rlimit_nofile = resource .getrlimit (resource .RLIMIT_NOFILE ),
91109 rlimit_memlock = resource .getrlimit (resource .RLIMIT_MEMLOCK ),
92- rlimit_as = resource .getrlimit (resource .RLIMIT_AS ))
110+ rlimit_as = resource .getrlimit (resource .RLIMIT_AS ),
111+ versions = self .collect_modules ())
93112
94113 return s
95114
115+ def collect_modules (self ):
116+ m = sys .modules
117+ r = {}
118+ for k in m :
119+ if m [k ]:
120+ d = m [k ].__dict__
121+ if "version" in d and d ["version" ]:
122+ r [k ] = d ["version" ]
123+ elif "__version__" in d and d ["__version__" ]:
124+ r [k ] = d ["__version__" ]
125+ else :
126+ r [k ] = "builtin"
127+ else :
128+ r [k ] = "builtin"
129+
130+ return r
131+
96132 def collect_metrics (self ):
97133 u = resource .getrusage (resource .RUSAGE_SELF )
134+ if gc .isenabled ():
135+ c = list (gc .get_count ())
136+ t = list (gc .get_threshold ())
137+ g = GC (collect0 = c [0 ] if not self .last_collect else c [0 ] - self .last_collect [0 ],
138+ collect1 = c [1 ] if not self .last_collect else c [1 ] - self .last_collect [1 ],
139+ collect2 = c [2 ] if not self .last_collect else c [2 ] - self .last_collect [2 ],
140+ threshold0 = t [0 ],
141+ threshold1 = t [1 ],
142+ threshold2 = t [2 ])
143+
98144 m = Metrics (ru_utime = u [0 ] if not self .last_usage else u [0 ] - self .last_usage [0 ],
99145 ru_stime = u [1 ] if not self .last_usage else u [1 ] - self .last_usage [1 ],
100146 ru_maxrss = u [2 ],
@@ -110,8 +156,11 @@ def collect_metrics(self):
110156 ru_msgrcv = u [12 ] if not self .last_usage else u [12 ] - self .last_usage [12 ],
111157 ru_nsignals = u [13 ] if not self .last_usage else u [13 ] - self .last_usage [13 ],
112158 ru_nvcs = u [14 ] if not self .last_usage else u [14 ] - self .last_usage [14 ],
113- ru_nivcsw = u [15 ] if not self .last_usage else u [15 ] - self .last_usage [15 ])
159+ ru_nivcsw = u [15 ] if not self .last_usage else u [15 ] - self .last_usage [15 ],
160+ gc = g )
114161
115162 self .last_usage = u
163+ if gc .isenabled ():
164+ self .last_collect = c
116165
117166 return m
0 commit comments