]> git.sur5r.net Git - openldap/blob - servers/slapd/monitor.c
Added connection initialisation and destruction notification. Now backends can regist...
[openldap] / servers / slapd / monitor.c
1 /*
2  * Copyright (c) 1995 Regents of the University of Michigan.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms are permitted
6  * provided that this notice is preserved and that due credit is given
7  * to the University of Michigan at Ann Arbor. The name of the University
8  * may not be used to endorse or promote products derived from this
9  * software without specific prior written permission. This software
10  * is provided ``as is'' without express or implied warranty.
11  */
12
13 #include "portable.h"
14
15 #include <stdio.h>
16
17 #include <ac/socket.h>
18 #include <ac/string.h>
19 #include <ac/time.h>
20
21 #include "ldap_defaults.h"
22 #include "slap.h"
23
24 #if defined( SLAPD_MONITOR_DN )
25
26 void
27 monitor_info( Connection *conn, Operation *op )
28 {
29         Entry           *e;
30         char            buf[BUFSIZ];
31         struct berval   val;
32         struct berval   *vals[2];
33         int    nconns, nwritewaiters, nreadwaiters;
34         struct tm       *ltm;
35         char            *p;
36 #ifdef LDAP_COUNTERS
37     int        i;
38     char       buf2[22]
39     char       buf3[22]
40         Connection *c;
41         int                     connindex;
42 #endif
43     time_t              currenttime;
44
45         vals[0] = &val;
46         vals[1] = NULL;
47
48         e = (Entry *) ch_calloc( 1, sizeof(Entry) );
49         /* initialize reader/writer lock */
50         e->e_attrs = NULL;
51         e->e_dn = ch_strdup( SLAPD_MONITOR_DN );
52         e->e_ndn = dn_normalize_case( ch_strdup(SLAPD_MONITOR_DN) );
53         e->e_private = NULL;
54
55         val.bv_val = (char *) Versionstr;
56         if (( p = strchr( Versionstr, '\n' )) == NULL ) {
57                 val.bv_len = strlen( Versionstr );
58         } else {
59                 val.bv_len = p - Versionstr;
60         }
61         attr_merge( e, "version", vals );
62
63         ldap_pvt_thread_mutex_lock( &active_threads_mutex );
64         sprintf( buf, "%d", active_threads );
65         ldap_pvt_thread_mutex_unlock( &active_threads_mutex );
66         val.bv_val = buf;
67         val.bv_len = strlen( buf );
68         attr_merge( e, "threads", vals );
69
70         nconns = 0;
71         nwritewaiters = 0;
72         nreadwaiters = 0;
73
74 #ifdef LDAP_COUNTERS
75         /* loop through the connections */
76         for ( c = connection_first( &connindex );
77                 c != NULL;
78                 c = connection_next( c, &connindex ))
79         {
80                 nconns++;
81                 if ( c->c_writewaiter ) {
82                         nwritewaiters++;
83                 }
84                 if ( c->c_currentber != NULL ) {
85                         nreadwaiters++;
86                 }
87
88                 ldap_pvt_thread_mutex_lock( &gmtime_mutex );
89 #ifndef LDAP_LOCALTIME
90                 ltm = gmtime( &c->c_starttime );
91                 strftime( buf2, sizeof(buf2), "%Y%m%d%H%M%SZ", ltm );
92
93                 ltm = gmtime( &c->.c_activitytime );
94                 strftime( buf3, sizeof(buf2), "%y%m%d%H%M%SZ", ltm );
95 #else
96                 ltm = localtime( &c->.c_starttime );
97                 strftime( buf2, sizeof(buf2), "%y%m%d%H%M%SZ", ltm );
98
99                 ltm = localtime( &c->.c_activitytime );
100                 strftime( buf3, sizeof(buf2), "%y%m%d%H%M%SZ", ltm );
101 #endif
102
103                 ldap_pvt_thread_mutex_unlock( &gmtime_mutex );
104
105                 sprintf( buf, "%d : %s : %d : %d : %s : %s%s%s%s : %s", i,
106                     buf2, c[i].c_n_ops_received, c[i].c_n_ops_completed,
107                     c[i].c_cdn ? c[i].c_cdn : "NULLDN",
108                     c[i].c_currentber ? "r" : "",
109                     c[i].c_writewaiter ? "w" : "",
110                     c[i].c_ops != NULL ? "x" : "",
111                     c[i].c_pending_ops != NULL ? "p" : ""
112                         buf3
113                 );
114
115                 val.bv_val = buf;
116                 val.bv_len = strlen( buf );
117                 attr_merge( e, "connection", vals );
118         }
119         connection_done(c);
120 #endif
121
122         sprintf( buf, "%d", nconns );
123         val.bv_val = buf;
124         val.bv_len = strlen( buf );
125         attr_merge( e, "currentconnections", vals );
126
127         sprintf( buf, "%ld", connections_nextid() );
128         val.bv_val = buf;
129         val.bv_len = strlen( buf );
130         attr_merge( e, "totalconnections", vals );
131
132         sprintf( buf, "%ld", (long) dtblsize );
133         val.bv_val = buf;
134         val.bv_len = strlen( buf );
135         attr_merge( e, "dtablesize", vals );
136
137         sprintf( buf, "%d", nwritewaiters );
138         val.bv_val = buf;
139         val.bv_len = strlen( buf );
140         attr_merge( e, "writewaiters", vals );
141
142         sprintf( buf, "%d", nreadwaiters );
143         val.bv_val = buf;
144         val.bv_len = strlen( buf );
145         attr_merge( e, "readwaiters", vals );
146
147 #ifdef LDAP_COUNTERS
148         ldap_pvt_thread_mutex_lock(&num_ops_mutex);
149         sprintf( buf, "%ld", num_ops_initiated );
150         ldap_pvt_thread_mutex_unlock(&num_ops_mutex);
151         val.bv_val = buf;
152         val.bv_len = strlen( buf );
153         attr_merge( e, "opsinitiated", vals );
154
155         ldap_pvt_thread_mutex_lock(&num_ops_mutex);
156         sprintf( buf, "%ld", num_ops_completed );
157         ldap_pvt_thread_mutex_unlock(&num_ops_mutex);
158         val.bv_val = buf;
159         val.bv_len = strlen( buf );
160         attr_merge( e, "opscompleted", vals );
161
162         ldap_pvt_thread_mutex_lock(&num_sent_mutex);
163         sprintf( buf, "%ld", num_entries_sent );
164         ldap_pvt_thread_mutex_unlock(&num_sent_mutex);
165         val.bv_val = buf;
166         val.bv_len = strlen( buf );
167         attr_merge( e, "entriessent", vals );
168
169         ldap_pvt_thread_mutex_lock(&num_sent_mutex);
170         sprintf( buf, "%ld", num_bytes_sent );
171         ldap_pvt_thread_mutex_unlock(&num_sent_mutex);
172         val.bv_val = buf;
173         val.bv_len = strlen( buf );
174         attr_merge( e, "bytessent", vals );
175 #endif
176
177         currenttime = slap_get_time();
178
179         ldap_pvt_thread_mutex_lock( &gmtime_mutex );
180 #ifndef LDAP_LOCALTIME
181         ltm = gmtime( &currenttime );
182         strftime( buf, sizeof(buf), "%Y%m%d%H%M%SZ", ltm );
183 #else
184         ltm = localtime( &currenttime );
185         strftime( buf, sizeof(buf), "%y%m%d%H%M%SZ", ltm );
186 #endif
187         val.bv_val = buf;
188         val.bv_len = strlen( buf );
189         attr_merge( e, "currenttime", vals );
190
191 #ifndef LDAP_LOCALTIME
192         ltm = gmtime( &starttime );
193         strftime( buf, sizeof(buf), "%Y%m%d%H%M%SZ", ltm );
194 #else
195         ltm = localtime( &starttime );
196         strftime( buf, sizeof(buf), "%y%m%d%H%M%SZ", ltm );
197 #endif
198         ldap_pvt_thread_mutex_unlock( &gmtime_mutex );
199
200         val.bv_val = buf;
201         val.bv_len = strlen( buf );
202         attr_merge( e, "starttime", vals );
203
204         sprintf( buf, "%d", nbackends );
205         val.bv_val = buf;
206         val.bv_len = strlen( buf );
207         attr_merge( e, "nbackends", vals );
208
209 #ifdef HAVE_THREAD_CONCURRENCY
210         sprintf( buf, "%d", ldap_pvt_thread_get_concurrency() );
211         val.bv_val = buf;
212         val.bv_len = strlen( buf );
213         attr_merge( e, "concurrency", vals );
214 #endif
215
216         send_search_entry( &backends[0], conn, op, e, NULL, 0 );
217         send_ldap_search_result( conn, op, LDAP_SUCCESS, NULL, NULL, 1 );
218
219         entry_free( e );
220 }
221
222 #endif /* slapd_monitor_dn */