Changeset 47a77d02f1268e637a4807266064909be566e1f7
- Timestamp:
- 10/24/09 18:57:58
(4 years ago)
- Author:
- Theo Schlossnagle <jesus@omniti.com>
- git-committer:
- Theo Schlossnagle <jesus@omniti.com> 1256410678 +0000
- git-parent:
[698542882ef39bf51805101908d69d90b9a2291a]
- git-author:
- Theo Schlossnagle <jesus@omniti.com> 1256410678 +0000
- Message:
flag-day(stratcond,webconsole,database) get realtime graphs working on uuids
-
Files:
-
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
| rb2014c0 |
r47a77d0 |
|
| 1 | | CREATE OR REPLACE FUNCTION stratcon.choose_storage_node_for_sid(in v_noit text, out o_storage_node_id int, out o_fqdn text, out o_dsn text) |
|---|
| | 1 | CREATE OR REPLACE FUNCTION stratcon.choose_storage_node_for_sid(in v_uuid uuid, in v_noit text, out o_storage_node_id int, out o_fqdn text, out o_dsn text) |
|---|
| 2 | 2 | RETURNS RECORD |
|---|
| 3 | 3 | AS $$ |
|---|
| 4 | 4 | BEGIN |
|---|
| 5 | | -- we could be smart with v_noit |
|---|
| | 5 | -- we could be smart with v_uuid and/or v_noit |
|---|
| 6 | 6 | SELECT storage_node_id, fqdn, dsn from stratcon.storage_node order by random() limit 1 INTO o_storage_node_id, o_dsn; |
|---|
| 7 | 7 | END |
|---|
| … | … | |
| 10 | 10 | ; |
|---|
| 11 | 11 | |
|---|
| 12 | | GRANT EXECUTE ON FUNCTION stratcon.choose_storage_node_for_sid(text) TO stratcon; |
|---|
| | 12 | GRANT EXECUTE ON FUNCTION stratcon.choose_storage_node_for_sid(uuid, text) TO stratcon; |
|---|
| r08e498f |
r47a77d0 |
|
| 1 | | CREATE OR REPLACE FUNCTION stratcon.map_uuid_to_sid(in v_uuid uuid, in v_noit text, out o_sid int, out o_storage_node_id int, out o_fqdn text, out o_dsn text) |
|---|
| | 1 | CREATE OR REPLACE FUNCTION stratcon.map_uuid_to_sid(in v_uuid uuid, in v_noit text, out o_sid int, out o_noit text, out o_storage_node_id int, out o_fqdn text, out o_dsn text) |
|---|
| 2 | 2 | RETURNS RECORD |
|---|
| 3 | 3 | AS $$ |
|---|
| … | … | |
| 6 | 6 | -- but I think we had a reason to use it |
|---|
| 7 | 7 | |
|---|
| 8 | | SELECT sid, storage_node_id, fqdn, dsn |
|---|
| | 8 | SELECT sid, storage_node_id, noit, fqdn, dsn |
|---|
| 9 | 9 | FROM stratcon.map_uuid_to_sid LEFT JOIN stratcon.storage_node USING (storage_node_id) |
|---|
| 10 | | WHERE id = v_uuid INTO o_sid, o_storage_node_id, o_fqdn, o_dsn; |
|---|
| | 10 | WHERE id = v_uuid INTO o_sid, o_storage_node_id, o_noit, o_fqdn, o_dsn; |
|---|
| 11 | 11 | IF NOT FOUND THEN |
|---|
| 12 | 12 | |
|---|
| 13 | 13 | SELECT nextval('stratcon.map_uuid_to_sid_sid_seq') INTO o_sid; |
|---|
| 14 | | SELECT * FROM stratcon.choose_storage_node_for_sid(v_noit) INTO o_storage_node_id, o_fqdn, o_dsn; |
|---|
| | 14 | SELECT * FROM stratcon.choose_storage_node_for_sid(v_uuid, v_noit) INTO o_storage_node_id, o_fqdn, o_dsn; |
|---|
| 15 | 15 | |
|---|
| 16 | | INSERT INTO stratcon.map_uuid_to_sid(id,sid,storage_node_id) VALUES (v_uuid, o_sid, o_storage_node_id); |
|---|
| | 16 | INSERT INTO stratcon.map_uuid_to_sid(id,sid,noit,storage_node_id) VALUES (v_uuid, o_sid, v_noit, o_storage_node_id); |
|---|
| 17 | 17 | |
|---|
| 18 | 18 | END IF; |
|---|
| ra34bc12 |
r47a77d0 |
|
| 22 | 22 | id uuid NOT NULL, |
|---|
| 23 | 23 | sid serial NOT NULL, |
|---|
| | 24 | noit text NOT NULL, |
|---|
| 24 | 25 | storage_node_id integer REFERENCES stratcon.storage_node |
|---|
| 25 | 26 | ); |
|---|
| recb7471 |
r47a77d0 |
|
| 46 | 46 | |
|---|
| 47 | 47 | #define FAIL(a) do { error = (a); goto error; } while(0) |
|---|
| 48 | | #define UUID_REGEX "[0-9a-fA-F]{4}(?:[0-9a-fA-F]{4}-){4}[0-9a-fA-F]{12}" |
|---|
| 49 | 48 | |
|---|
| 50 | 49 | #define NODE_CONTENT(parent, k, v) do { \ |
|---|
| r88a7178 |
r47a77d0 |
|
| 135 | 135 | #include "noitedit/strlcpy.h" |
|---|
| 136 | 136 | |
|---|
| | 137 | #define UUID_REGEX "[0-9a-fA-F]{4}(?:[0-9a-fA-F]{4}-){4}[0-9a-fA-F]{12}" |
|---|
| | 138 | |
|---|
| 137 | 139 | #endif |
|---|
| rf742d08 |
r47a77d0 |
|
| 84 | 84 | <allchecks><![CDATA[ |
|---|
| 85 | 85 | SELECT remote_address, id, target, module, name |
|---|
| 86 | | FROM noit.get_checks() |
|---|
| | 86 | FROM check_currently |
|---|
| 87 | 87 | ]]></allchecks> |
|---|
| 88 | 88 | <findcheck><![CDATA[ |
|---|
| 89 | 89 | SELECT remote_address, id, target, module, name |
|---|
| 90 | | FROM noit.get_check($1,$2) |
|---|
| | 90 | FROM check_currently |
|---|
| | 91 | WHERE sid = $1 |
|---|
| 91 | 92 | ]]></findcheck> |
|---|
| 92 | 93 | <allstoragenodes><![CDATA[ |
|---|
| … | … | |
| 100 | 101 | ]]></findstoragenode> |
|---|
| 101 | 102 | <mapallchecks><![CDATA[ |
|---|
| 102 | | SELECT id, sid, storage_node_id, fqdn, dsn |
|---|
| | 103 | SELECT id, sid, noit as remote_cn, storage_node_id, fqdn, dsn |
|---|
| 103 | 104 | FROM stratcon.map_uuid_to_sid LEFT JOIN stratcon.storage_node USING (storage_node_id) |
|---|
| 104 | 105 | ]]></mapallchecks> |
|---|
| rcdb26b4 |
r47a77d0 |
|
| 161 | 161 | static int stratcon_database_connect(conn_q *cq); |
|---|
| 162 | 162 | static int uuid_to_sid(const char *uuid_str_in, const char *remote_cn); |
|---|
| | 163 | static int storage_node_quick_lookup(const char *uuid_str, |
|---|
| | 164 | const char *remote_cn, |
|---|
| | 165 | int *sid_out, int *storagenode_id_out, |
|---|
| | 166 | const char **remote_cn_out, |
|---|
| | 167 | const char **fqdn_out, |
|---|
| | 168 | const char **dsn_out); |
|---|
| 163 | 169 | |
|---|
| 164 | 170 | static void |
|---|
| … | … | |
| 178 | 184 | typedef struct { |
|---|
| 179 | 185 | char *uuid_str; |
|---|
| | 186 | char *remote_cn; |
|---|
| 180 | 187 | int storagenode_id; |
|---|
| 181 | 188 | int sid; |
|---|
| … | … | |
| 476 | 483 | char buff[1024]; |
|---|
| 477 | 484 | conn_q *cq; |
|---|
| 478 | | cq = get_conn_q_for_metanode(); |
|---|
| 479 | | |
|---|
| 480 | 485 | if(!(mask & EVENTER_ASYNCH_WORK)) return 0; |
|---|
| 481 | 486 | if(mask & EVENTER_ASYNCH_CLEANUP) return 0; |
|---|
| 482 | 487 | |
|---|
| | 488 | cq = get_conn_q_for_metanode(); |
|---|
| 483 | 489 | stratcon_database_connect(cq); |
|---|
| 484 | 490 | d = calloc(1, sizeof(*d)); |
|---|
| … | … | |
| 538 | 544 | } |
|---|
| 539 | 545 | execute_outcome_t |
|---|
| 540 | | stratcon_datastore_find(conn_q *cq, ds_rt_detail *d) { |
|---|
| | 546 | stratcon_datastore_find(ds_rt_detail *d) { |
|---|
| | 547 | conn_q *cq; |
|---|
| 541 | 548 | char *val; |
|---|
| 542 | 549 | int row_count; |
|---|
| 543 | 550 | struct realtime_tracker *node; |
|---|
| 544 | 551 | |
|---|
| 545 | | GET_QUERY(check_find); |
|---|
| 546 | 552 | for(node = d->rt; node; node = node->next) { |
|---|
| | 553 | char uuid_str[UUID_STR_LEN+1]; |
|---|
| | 554 | const char *fqdn, *dsn, *remote_cn; |
|---|
| | 555 | int storagenode_id; |
|---|
| | 556 | |
|---|
| | 557 | uuid_unparse_lower(node->checkid, uuid_str); |
|---|
| | 558 | if(storage_node_quick_lookup(uuid_str, NULL, &node->sid, |
|---|
| | 559 | &storagenode_id, &remote_cn, &fqdn, &dsn)) |
|---|
| | 560 | continue; |
|---|
| | 561 | |
|---|
| | 562 | cq = get_conn_q_for_remote(NULL, remote_cn, fqdn, dsn); |
|---|
| | 563 | stratcon_database_connect(cq); |
|---|
| | 564 | |
|---|
| | 565 | GET_QUERY(check_find); |
|---|
| 547 | 566 | DECLARE_PARAM_INT(node->sid); |
|---|
| 548 | 567 | PG_EXEC(check_find); |
|---|
| … | … | |
| 575 | 594 | free_params((ds_single_detail *)d); |
|---|
| 576 | 595 | d->nparams = 0; |
|---|
| | 596 | release_conn_q(cq); |
|---|
| 577 | 597 | } |
|---|
| 578 | 598 | return DS_EXEC_SUCCESS; |
|---|
| … | … | |
| 878 | 898 | struct timeval *now) { |
|---|
| 879 | 899 | ds_rt_detail *dsjd = closure; |
|---|
| 880 | | conn_q *cq; |
|---|
| 881 | 900 | if(!(mask & EVENTER_ASYNCH_WORK)) return 0; |
|---|
| 882 | | |
|---|
| 883 | | cq = get_conn_q_for_metanode(); |
|---|
| 884 | | stratcon_database_connect(cq); |
|---|
| | 901 | if(mask & EVENTER_ASYNCH_CLEANUP) return 0; |
|---|
| | 902 | |
|---|
| 885 | 903 | assert(dsjd->rt); |
|---|
| 886 | | stratcon_datastore_find(cq, dsjd); |
|---|
| | 904 | stratcon_datastore_find(dsjd); |
|---|
| 887 | 905 | if(dsjd->completion_event) |
|---|
| 888 | 906 | eventer_add(dsjd->completion_event); |
|---|
| … | … | |
| 890 | 908 | free_params((ds_single_detail *)dsjd); |
|---|
| 891 | 909 | free(dsjd); |
|---|
| 892 | | release_conn_q(cq); |
|---|
| 893 | 910 | return 0; |
|---|
| 894 | 911 | } |
|---|
| … | … | |
| 1160 | 1177 | return ij; |
|---|
| 1161 | 1178 | } |
|---|
| 1162 | | static void |
|---|
| | 1179 | static int |
|---|
| 1163 | 1180 | storage_node_quick_lookup(const char *uuid_str, const char *remote_cn, |
|---|
| 1164 | 1181 | int *sid_out, int *storagenode_id_out, |
|---|
| 1165 | | char **fqdn_out, char **dsn_out) { |
|---|
| | 1182 | const char **remote_cn_out, |
|---|
| | 1183 | const char **fqdn_out, const char **dsn_out) { |
|---|
| 1166 | 1184 | /* only called from the main thread -- no safety issues */ |
|---|
| 1167 | 1185 | void *vuuidinfo, *vinfo; |
|---|
| … | … | |
| 1173 | 1191 | if(!noit_hash_retrieve(&uuid_to_info_cache, uuid_str, strlen(uuid_str), |
|---|
| 1174 | 1192 | &vuuidinfo)) { |
|---|
| 1175 | | int row_count; |
|---|
| | 1193 | int row_count = 0; |
|---|
| 1176 | 1194 | char *tmpint; |
|---|
| 1177 | 1195 | ds_single_detail *d; |
|---|
| 1178 | 1196 | conn_q *cq; |
|---|
| | 1197 | |
|---|
| | 1198 | /* We can't do a database lookup without the remote_cn */ |
|---|
| | 1199 | if(!remote_cn) return -1; |
|---|
| | 1200 | |
|---|
| 1179 | 1201 | d = calloc(1, sizeof(*d)); |
|---|
| 1180 | 1202 | cq = get_conn_q_for_metanode(); |
|---|
| … | … | |
| 1202 | 1224 | free(d); |
|---|
| 1203 | 1225 | release_conn_q(cq); |
|---|
| | 1226 | if(row_count != 1) return -1; |
|---|
| 1204 | 1227 | /* Place in cache */ |
|---|
| 1205 | 1228 | if(fqdn) fqdn = strdup(fqdn); |
|---|
| … | … | |
| 1207 | 1230 | uuidinfo->sid = sid; |
|---|
| 1208 | 1231 | uuidinfo->uuid_str = strdup(uuid_str); |
|---|
| | 1232 | uuidinfo->remote_cn = strdup(remote_cn); |
|---|
| 1209 | 1233 | noit_hash_store(&uuid_to_info_cache, |
|---|
| 1210 | 1234 | uuidinfo->uuid_str, strlen(uuidinfo->uuid_str), uuidinfo); |
|---|
| … | … | |
| 1251 | 1275 | if(fqdn_out) *fqdn_out = fqdn ? fqdn : (info ? info->fqdn : NULL); |
|---|
| 1252 | 1276 | if(dsn_out) *dsn_out = dsn ? dsn : (info ? info->dsn : NULL); |
|---|
| | 1277 | if(remote_cn_out) *remote_cn_out = uuidinfo->remote_cn; |
|---|
| 1253 | 1278 | if(storagenode_id_out) *storagenode_id_out = uuidinfo->storagenode_id; |
|---|
| 1254 | 1279 | if(sid_out) *sid_out = uuidinfo->sid; |
|---|
| | 1280 | return 0; |
|---|
| 1255 | 1281 | } |
|---|
| 1256 | 1282 | static int |
|---|
| … | … | |
| 1259 | 1285 | int sid = 0; |
|---|
| 1260 | 1286 | strlcpy(uuid_str, uuid_str_in, sizeof(uuid_str)); |
|---|
| 1261 | | storage_node_quick_lookup(uuid_str, remote_cn, &sid, NULL, NULL, NULL); |
|---|
| | 1287 | storage_node_quick_lookup(uuid_str, remote_cn, &sid, NULL, NULL, NULL, NULL); |
|---|
| 1262 | 1288 | return sid; |
|---|
| 1263 | 1289 | } |
|---|
| … | … | |
| 1266 | 1292 | const char *remote_cn, const char *line) { |
|---|
| 1267 | 1293 | interim_journal_t *ij = NULL; |
|---|
| 1268 | | char uuid_str[UUID_STR_LEN+1], *cp, *fqdn, *dsn; |
|---|
| | 1294 | char uuid_str[UUID_STR_LEN+1], *cp; |
|---|
| | 1295 | const char *fqdn, *dsn; |
|---|
| 1269 | 1296 | int storagenode_id = 0; |
|---|
| 1270 | 1297 | uuid_t checkid; |
|---|
| … | … | |
| 1279 | 1306 | if(!uuid_parse(uuid_str, checkid)) { |
|---|
| 1280 | 1307 | storage_node_quick_lookup(uuid_str, remote_cn, NULL, |
|---|
| 1281 | | &storagenode_id, &fqdn, &dsn); |
|---|
| | 1308 | &storagenode_id, NULL, &fqdn, &dsn); |
|---|
| 1282 | 1309 | ij = interim_journal_get(remote, remote_cn, storagenode_id, fqdn); |
|---|
| 1283 | 1310 | } |
|---|
| … | … | |
| 1541 | 1568 | for(i=0; i<cnt; i++) { |
|---|
| 1542 | 1569 | void *vinfo; |
|---|
| 1543 | | char *tmpint, *fqdn, *dsn, *uuid_str; |
|---|
| | 1570 | char *tmpint, *fqdn, *dsn, *uuid_str, *remote_cn; |
|---|
| 1544 | 1571 | int sid, storagenode_id; |
|---|
| 1545 | 1572 | uuid_info *uuidinfo; |
|---|
| … | … | |
| 1551 | 1578 | PG_GET_STR_COL(fqdn, i, "fqdn"); |
|---|
| 1552 | 1579 | PG_GET_STR_COL(dsn, i, "dsn"); |
|---|
| | 1580 | PG_GET_STR_COL(remote_cn, i, "remote_cn"); |
|---|
| 1553 | 1581 | PG_GET_STR_COL(tmpint, i, "storage_node_id"); |
|---|
| 1554 | 1582 | storagenode_id = tmpint ? atoi(tmpint) : 0; |
|---|
| … | … | |
| 1556 | 1584 | uuidinfo = calloc(1, sizeof(*uuidinfo)); |
|---|
| 1557 | 1585 | uuidinfo->uuid_str = strdup(uuid_str); |
|---|
| | 1586 | uuidinfo->remote_cn = strdup(remote_cn); |
|---|
| 1558 | 1587 | uuidinfo->sid = sid; |
|---|
| 1559 | 1588 | noit_hash_store(&uuid_to_info_cache, |
|---|
| r5360a1e |
r47a77d0 |
|
| 536 | 536 | |
|---|
| 537 | 537 | if(op == DS_OP_CHKPT) { |
|---|
| 538 | | eventer_add((eventer_t) operand); |
|---|
| | 538 | eventer_add(completion); |
|---|
| 539 | 539 | return; |
|---|
| 540 | 540 | } |
|---|
| r5360a1e |
r47a77d0 |
|
| 198 | 198 | interest; |
|---|
| 199 | 199 | interest = strtok_r(NULL, "/", &brk)) { |
|---|
| | 200 | uuid_t in_uuid; |
|---|
| 200 | 201 | struct realtime_tracker *node; |
|---|
| 201 | 202 | char *interval; |
|---|
| … | … | |
| 206 | 207 | else |
|---|
| 207 | 208 | *interval++ = '\0'; |
|---|
| | 209 | if(uuid_parse(interest, in_uuid)) continue; |
|---|
| 208 | 210 | node = calloc(1, sizeof(*node)); |
|---|
| 209 | 211 | node->rc = rc; |
|---|
| 210 | | node->sid = atoi(interest); |
|---|
| | 212 | uuid_copy(node->checkid, in_uuid); |
|---|
| 211 | 213 | node->interval = atoi(interval); |
|---|
| 212 | 214 | node->next = rc->checklist; |
|---|
| … | … | |
| 426 | 428 | /* Each interest references the ctx */ |
|---|
| 427 | 429 | for(node = rc->checklist; node; node = node->next) { |
|---|
| | 430 | char uuid_str[UUID_STR_LEN+1]; |
|---|
| 428 | 431 | noit_atomic_inc32(&ctx->ref_cnt); |
|---|
| 429 | | noitL(noit_error, "Resolving sid: %d\n", node->sid); |
|---|
| | 432 | uuid_unparse_lower(node->checkid, uuid_str); |
|---|
| | 433 | noitL(noit_error, "Resolving uuid: %s\n", uuid_str); |
|---|
| 430 | 434 | } |
|---|
| 431 | 435 | completion = eventer_alloc(); |
|---|
| … | … | |
| 477 | 481 | stratcon_realtime_http_handler); |
|---|
| 478 | 482 | assert(noit_http_rest_register( |
|---|
| 479 | | "GET", "/data/", "^((?:\\d+(?:@\\d+)?)(?:/\\d+(?:@\\d+)?)*)$", |
|---|
| | 483 | "GET", "/data/", |
|---|
| | 484 | "^((?:" UUID_REGEX "(?:@\\d+)?)(?:/" UUID_REGEX "(?:@\\d+)?)*)$", |
|---|
| 480 | 485 | rest_stream_data |
|---|
| 481 | 486 | ) == 0); |
|---|
| r88a7178 |
r47a77d0 |
|
| 40 | 40 | */ |
|---|
| 41 | 41 | struct realtime_tracker { |
|---|
| 42 | | int sid; /* set by request */ |
|---|
| | 42 | uuid_t checkid; /* set by request */ |
|---|
| 43 | 43 | int interval; /* set by request */ |
|---|
| 44 | 44 | char *noit; /* resolved by datastore */ |
|---|
| 45 | | uuid_t checkid; /* resolved by datastore */ |
|---|
| | 45 | int sid; /* resolved by datastore */ |
|---|
| 46 | 46 | struct realtime_tracker *next; /* next in series */ |
|---|
| 47 | 47 | eventer_t conn; /* used to track noitd connection feeding this */ |
|---|
| r8f79bcd |
r47a77d0 |
|
| 12 | 12 | LoadModule dir_module /usr/libexec/apache2/mod_dir.so |
|---|
| 13 | 13 | LoadModule rewrite_module /usr/libexec/apache2/mod_rewrite.so |
|---|
| | 14 | LoadModule proxy_module /usr/libexec/apache2/mod_proxy.so |
|---|
| | 15 | LoadModule proxy_http_module /usr/libexec/apache2/mod_proxy_http.so |
|---|
| 14 | 16 | |
|---|
| 15 | 17 | <Directory "/"> |
|---|
| … | … | |
| 46 | 48 | DirectoryIndex index.php |
|---|
| 47 | 49 | DefaultType text/plain |
|---|
| | 50 | |
|---|
| | 51 | RewriteEngine On |
|---|
| | 52 | RewriteRule ^(/data/.+)$ http://localhost:80$1 [P,L,QSA] |
|---|
| r462702b |
r47a77d0 |
|
| 49 | 49 | ); |
|---|
| 50 | 50 | if($item['unique']) { |
|---|
| 51 | | $jitem['text'] = '<a href="javascript:graph_add_datapoint({\'sid\' : ' . $item['sid'] . ', \'module\' : \'' . $item['module'] . '\', \'target\' : \'' . $item['target'] . '\', \'name\' : \'' . $item['target'] . '`' . $item['metric_name'] . '\', \'metric_name\' : \'' . $item['metric_name'] . '\', \'metric_type\' : \'' . $item['metric_type'] . '\'})">' . $item[$want] . '</a>'; |
|---|
| | 51 | $jitem['text'] = '<a href="javascript:graph_add_datapoint({\'id\' : \'' . $item['id'] . '\', \'sid\' : ' . $item['sid'] . ', \'module\' : \'' . $item['module'] . '\', \'target\' : \'' . $item['target'] . '\', \'name\' : \'' . $item['target'] . '`' . $item['metric_name'] . '\', \'metric_name\' : \'' . $item['metric_name'] . '\', \'metric_type\' : \'' . $item['metric_type'] . '\'})">' . $item[$want] . '</a>'; |
|---|
| 52 | 52 | if($item['metric_type'] == "numeric") { |
|---|
| 53 | 53 | $jitem['classes'] = 'metric numeric'; |
|---|
| r4ce18ee |
r47a77d0 |
|
| 911 | 911 | return function() { |
|---|
| 912 | 912 | graph_add_datapoint({ |
|---|
| | 913 | 'id': ds_c.id, |
|---|
| 913 | 914 | 'sid': ds_c.sid, |
|---|
| 914 | 915 | 'name': ds_c.target + '`' + ds_c.metric_name, |
|---|
| … | … | |
| 992 | 993 | //we assume we never give datasets we dont want to graph sids, like composites |
|---|
| 993 | 994 | for (var i = 0; i < g.datapoints.length; i++) { |
|---|
| 994 | | if (g.datapoints[i].sid) { |
|---|
| 995 | | sidneed[g.datapoints[i].sid] = polltime; |
|---|
| 996 | | } |
|---|
| 997 | | } |
|---|
| 998 | | for (var sid in sidneed) { |
|---|
| 999 | | sids += "/" + sid + "@" + sidneed[sid]; |
|---|
| | 995 | if (g.datapoints[i].id) { |
|---|
| | 996 | sidneed[g.datapoints[i].id] = polltime; |
|---|
| | 997 | } |
|---|
| | 998 | } |
|---|
| | 999 | for (var id in sidneed) { |
|---|
| | 1000 | sids += "/" + id + "@" + sidneed[id]; |
|---|
| 1000 | 1001 | } |
|---|
| 1001 | 1002 | //console.log("sids request: http://" +recon_realtime_hostname+"/data"+sids); |
|---|