001 /* 002 * Copyright 2008-2015 UnboundID Corp. 003 * All Rights Reserved. 004 */ 005 /* 006 * Copyright (C) 2015 UnboundID Corp. 007 * 008 * This program is free software; you can redistribute it and/or modify 009 * it under the terms of the GNU General Public License (GPLv2 only) 010 * or the terms of the GNU Lesser General Public License (LGPLv2.1 only) 011 * as published by the Free Software Foundation. 012 * 013 * This program is distributed in the hope that it will be useful, 014 * but WITHOUT ANY WARRANTY; without even the implied warranty of 015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 016 * GNU General Public License for more details. 017 * 018 * You should have received a copy of the GNU General Public License 019 * along with this program; if not, see <http://www.gnu.org/licenses>. 020 */ 021 package com.unboundid.ldap.sdk.unboundidds.monitors; 022 023 024 025 import java.util.Collections; 026 import java.util.Date; 027 import java.util.LinkedHashMap; 028 import java.util.List; 029 import java.util.Map; 030 031 import com.unboundid.ldap.sdk.Entry; 032 import com.unboundid.util.NotMutable; 033 import com.unboundid.util.ThreadSafety; 034 import com.unboundid.util.ThreadSafetyLevel; 035 036 import static com.unboundid.ldap.sdk.unboundidds.monitors.MonitorMessages.*; 037 038 039 040 /** 041 * <BLOCKQUOTE> 042 * <B>NOTE:</B> This class is part of the Commercial Edition of the UnboundID 043 * LDAP SDK for Java. It is not available for use in applications that 044 * include only the Standard Edition of the LDAP SDK, and is not supported for 045 * use in conjunction with non-UnboundID products. 046 * </BLOCKQUOTE> 047 * This class defines a monitor entry that provides general information about 048 * the state of the Directory Server. The general monitor entry is the 049 * top-level monitor entry that is generated by the monitor backend and is the 050 * parent of all monitor entries generated by the registered monitor providers. 051 * Information that may be included in the general monitor entry includes: 052 * <UL> 053 * <LI>The number of connections currently established to the server.</LI> 054 * <LI>The maximum number of connections that have been established at any one 055 * time.</LI> 056 * <LI>The total number of connections established to the server since 057 * startup.</LI> 058 * <LI>The time that the directory server was started.</LI> 059 * <LI>The current time on the server.</LI> 060 * <LI>The length of time in milliseconds that the server has been 061 * online.</LI> 062 * <LI>A user-friendly string that describes the length of time that the 063 * server has been online.</LI> 064 * <LI>The name of the directory server product.</LI> 065 * <LI>The name of the vendor that provides the directory server.</LI> 066 * <LI>The server version string.</LI> 067 * <LI>The DNs of the configuration entries for any third-party extensions 068 * loaded in the server.</LI> 069 * </UL> 070 * The server should present at most one general monitor entry. It can be 071 * retrieved using the {@link MonitorManager#getGeneralMonitorEntry} method. 072 * This entry provides specific methods for accessing information about the 073 * server (e.g., the 074 * {@link GeneralMonitorEntry#getCurrentConnections} method can be used 075 * to retrieve the number of connections currently established). Alternately, 076 * this information may be accessed using the generic API. See the 077 * {@link MonitorManager} class documentation for an example that demonstrates 078 * the use of the generic API for accessing monitor data. 079 */ 080 @NotMutable() 081 @ThreadSafety(level=ThreadSafetyLevel.COMPLETELY_THREADSAFE) 082 public final class GeneralMonitorEntry 083 extends MonitorEntry 084 { 085 /** 086 * The structural object class used in general monitor entries. 087 */ 088 static final String GENERAL_MONITOR_OC = "ds-general-monitor-entry"; 089 090 091 092 /** 093 * The name of the attribute that contains the number of connections currently 094 * established to the server. 095 */ 096 private static final String ATTR_CURRENT_CONNECTIONS = "currentConnections"; 097 098 099 100 /** 101 * The name of the attribute that contains the Directory Server's current 102 * time. 103 */ 104 private static final String ATTR_CURRENT_TIME = "currentTime"; 105 106 107 108 /** 109 * The name of the attribute that contains the names of any alert types that 110 * have caused the server to be classified as "degraded". 111 */ 112 private static final String ATTR_DEGRADED_ALERT_TYPE = 113 "degraded-alert-type"; 114 115 116 117 /** 118 * The name of the attribute that contains the server instance name. 119 */ 120 private static final String ATTR_INSTANCE_NAME = "instanceName"; 121 122 123 124 /** 125 * The name of the attribute that contains the maximum number of concurrent 126 * client connections established since startup. 127 */ 128 private static final String ATTR_MAX_CONNECTIONS = "maxConnections"; 129 130 131 132 /** 133 * The name of the attribute that contains the Directory Server product name. 134 */ 135 private static final String ATTR_PRODUCT_NAME = "productName"; 136 137 138 139 /** 140 * The name of the attribute that contains the Directory Server start time. 141 */ 142 private static final String ATTR_START_TIME = "startTime"; 143 144 145 146 /** 147 * The name of the attribute that contains the Directory Server startup ID. 148 */ 149 private static final String ATTR_STARTUP_ID = "startupID"; 150 151 152 153 /** 154 * The name of the attribute that contains the Directory Server startup UUID. 155 */ 156 private static final String ATTR_STARTUP_UUID = "startupUUID"; 157 158 159 160 /** 161 * The name of the attribute that holds the DNs of the configuration entries 162 * for any third-party extensions loaded in the server. 163 */ 164 private static final String ATTR_THIRD_PARTY_EXTENSION_DN = 165 "thirdPartyExtensionDN"; 166 167 168 169 /** 170 * The name of the attribute that contains the total number of connections 171 * that have been established since startup. 172 */ 173 private static final String ATTR_TOTAL_CONNECTIONS = "totalConnections"; 174 175 176 177 /** 178 * The name of the attribute that contains the Directory Server's uptime. 179 */ 180 private static final String ATTR_UP_TIME = "upTime"; 181 182 183 184 /** 185 * The name of the attribute that contains the Directory Server vendor name. 186 */ 187 private static final String ATTR_VENDOR_NAME = "productVendor"; 188 189 190 191 /** 192 * The name of the attribute that contains the Directory Server version 193 * string. 194 */ 195 private static final String ATTR_VERSION = "productVersion"; 196 197 198 199 /** 200 * The name of the attribute that contains the names of any alert types that 201 * have caused the server to be classified as "unavailable". 202 */ 203 private static final String ATTR_UNAVAILABLE_ALERT_TYPE = 204 "unavailable-alert-type"; 205 206 207 208 /** 209 * The serial version UID for this serializable class. 210 */ 211 private static final long serialVersionUID = 4262569940859462743L; 212 213 214 215 // The server's current time. 216 private final Date currentTime; 217 218 // The server's start time. 219 private final Date startTime; 220 221 // The names of the alert types that have caused the server to be classified 222 // as "degraded". 223 private final List<String> degradedAlertTypes; 224 225 // The DNs of the config entries for any third-party extensions loaded in the 226 // server. 227 private final List<String> thirdPartyExtensionDNs; 228 229 // The names of the alert types that have caused the server to be classified 230 // as "unavailable". 231 private final List<String> unavailableAlertTypes; 232 233 // The number connections currently established. 234 private final Long currentConnections; 235 236 // The maximum number connections established at any time since startup. 237 private final Long maxConnections; 238 239 // The total number of connections that have been established since startup. 240 private final Long totalConnections; 241 242 // The Directory Server instance name. 243 private final String instanceName; 244 245 // The Directory Server product name. 246 private final String productName; 247 248 // The Directory Server startup ID. 249 private final String startupID; 250 251 // The Directory Server startup UUID. 252 private final String startupUUID; 253 254 // The string representation of the uptime. 255 private final String uptime; 256 257 // The Directory Server vendor name. 258 private final String vendorName; 259 260 // The Directory Server version string. 261 private final String versionString; 262 263 264 265 /** 266 * Creates a new general monitor entry from the provided entry. 267 * 268 * @param entry The entry to be parsed as a general monitor entry. It must 269 * not be {@code null}. 270 */ 271 public GeneralMonitorEntry(final Entry entry) 272 { 273 super(entry); 274 275 currentConnections = getLong(ATTR_CURRENT_CONNECTIONS); 276 currentTime = getDate(ATTR_CURRENT_TIME); 277 maxConnections = getLong(ATTR_MAX_CONNECTIONS); 278 productName = getString(ATTR_PRODUCT_NAME); 279 startTime = getDate(ATTR_START_TIME); 280 instanceName = getString(ATTR_INSTANCE_NAME); 281 startupID = getString(ATTR_STARTUP_ID); 282 startupUUID = getString(ATTR_STARTUP_UUID); 283 totalConnections = getLong(ATTR_TOTAL_CONNECTIONS); 284 uptime = getString(ATTR_UP_TIME); 285 vendorName = getString(ATTR_VENDOR_NAME); 286 versionString = getString(ATTR_VERSION); 287 degradedAlertTypes = getStrings(ATTR_DEGRADED_ALERT_TYPE); 288 unavailableAlertTypes = getStrings(ATTR_UNAVAILABLE_ALERT_TYPE); 289 thirdPartyExtensionDNs = getStrings(ATTR_THIRD_PARTY_EXTENSION_DN); 290 } 291 292 293 294 /** 295 * Retrieves the number of connections currently established. 296 * 297 * @return The number of connections currently established, or {@code null} 298 * if it was not included in the monitor entry. 299 */ 300 public Long getCurrentConnections() 301 { 302 return currentConnections; 303 } 304 305 306 307 /** 308 * Retrieves the maximum number of concurrent connections established at any 309 * time since startup. 310 * 311 * @return The maximum number of concurrent connections established at any 312 * time since startup, or {@code null} if it was not included in the 313 * monitor entry. 314 */ 315 public Long getMaxConnections() 316 { 317 return maxConnections; 318 } 319 320 321 322 /** 323 * Retrieves the total number of connections established since startup. 324 * 325 * @return The total number of connections established since startup, or 326 * {@code null} if it was not included in the monitor entry. 327 */ 328 public Long getTotalConnections() 329 { 330 return totalConnections; 331 } 332 333 334 335 /** 336 * Retrieves the current time as reported by the Directory Server. 337 * 338 * @return The current time as reported by the Directory Server, or 339 * {@code null} if it was not included in the monitor entry. 340 */ 341 public Date getCurrentTime() 342 { 343 return currentTime; 344 } 345 346 347 348 /** 349 * Retrieves the time that the Directory Server was started. 350 * 351 * @return The time that the Directory Server was started, or {@code null} if 352 * it was not included in the monitor entry. 353 */ 354 public Date getStartTime() 355 { 356 return startTime; 357 } 358 359 360 361 /** 362 * Retrieves the name assigned to the Directory Server instance. 363 * 364 * @return The name assigned to the Directory Server instance, or 365 * {@code null} if it was not included in the monitor entry. 366 */ 367 public String getInstanceName() 368 { 369 return instanceName; 370 } 371 372 373 374 /** 375 * Retrieves a relatively compact identifier generated at the time the 376 * Directory Server was started. 377 * 378 * @return A relatively compact identifier generated at the time the 379 * Directory Server was started, or {@code null} if it was not 380 * included in the monitor entry. 381 */ 382 public String getStartupID() 383 { 384 return startupID; 385 } 386 387 388 389 /** 390 * Retrieves the UUID that was generated when the Directory Server was 391 * started. 392 * 393 * @return The UUID that was generated when the Directory Server was started, 394 * or {@code null} if it was not included in the monitor entry. 395 */ 396 public String getStartupUUID() 397 { 398 return startupUUID; 399 } 400 401 402 403 /** 404 * Retrieves the Directory Server uptime in milliseconds. 405 * 406 * @return The Directory Server uptime in milliseconds, or {@code null} if 407 * either the current time or the start time was not available. 408 */ 409 public Long getUptimeMillis() 410 { 411 if ((currentTime == null) || (startTime == null)) 412 { 413 return null; 414 } 415 416 return currentTime.getTime() - startTime.getTime(); 417 } 418 419 420 421 /** 422 * Retrieves the human-readable string representation of the Directory Server 423 * uptime. 424 * 425 * @return The human-readable string representation of the Directory Server 426 * uptime, or {@code null} if it was not included in the monitor 427 * entry. 428 */ 429 public String getUptimeString() 430 { 431 return uptime; 432 } 433 434 435 436 /** 437 * Retrieves the Directory Server product name. 438 * 439 * @return The Directory Serve product name, or {@code null} if it was not 440 * included in the monitor entry. 441 */ 442 public String getProductName() 443 { 444 return productName; 445 } 446 447 448 449 /** 450 * Retrieves the Directory Server vendor name string. 451 * 452 * @return The Directory Server vendor name string, or {@code null} if it 453 * was not included in the monitor entry. 454 */ 455 public String getVendorName() 456 { 457 return vendorName; 458 } 459 460 461 462 /** 463 * Retrieves the Directory Server version string. 464 * 465 * @return The Directory Server version string, or {@code null} if it was not 466 * included in the monitor entry. 467 */ 468 public String getVersionString() 469 { 470 return versionString; 471 } 472 473 474 475 /** 476 * Retrieves the names of any alert types which may have caused the server to 477 * be currently classified as "degraded". 478 * 479 * @return The names of any alert types which may have caused the server to 480 * be currently classified as "degraded", or an empty list if it was 481 * not included in the monitor entry (which likely indicates that the 482 * server is not classified as "degraded"). 483 */ 484 public List<String> getDegradedAlertTypes() 485 { 486 return degradedAlertTypes; 487 } 488 489 490 491 /** 492 * Retrieves the names of any alert types which may have caused the server to 493 * be currently classified as "unavailable". 494 * 495 * @return The names of any alert types which may have caused the server to 496 * be currently classified as "unavailable", or an empty list if it 497 * was not included in the monitor entry (which likely indicates that 498 * the server is not classified as "unavailable"). 499 */ 500 public List<String> getUnavailableAlertTypes() 501 { 502 return unavailableAlertTypes; 503 } 504 505 506 507 /** 508 * Retrieves the DNs of the configuration entries for any third-party 509 * extensions currently loaded in the server. 510 * 511 * @return The DNs of the configuration entries for any third-party 512 * extensions currently loaded in the server, or an empty list if it 513 * was not included in the monitor entry. 514 */ 515 public List<String> getThirdPartyExtensionDNs() 516 { 517 return thirdPartyExtensionDNs; 518 } 519 520 521 522 /** 523 * {@inheritDoc} 524 */ 525 @Override() 526 public String getMonitorDisplayName() 527 { 528 return INFO_GENERAL_MONITOR_DISPNAME.get(); 529 } 530 531 532 533 /** 534 * {@inheritDoc} 535 */ 536 @Override() 537 public String getMonitorDescription() 538 { 539 return INFO_GENERAL_MONITOR_DESC.get(); 540 } 541 542 543 544 /** 545 * {@inheritDoc} 546 */ 547 @Override() 548 public Map<String,MonitorAttribute> getMonitorAttributes() 549 { 550 final LinkedHashMap<String,MonitorAttribute> attrs = 551 new LinkedHashMap<String,MonitorAttribute>(); 552 553 if (productName != null) 554 { 555 addMonitorAttribute(attrs, 556 ATTR_PRODUCT_NAME, 557 INFO_GENERAL_DISPNAME_PRODUCT_NAME.get(), 558 INFO_GENERAL_DESC_PRODUCT_NAME.get(), 559 productName); 560 } 561 562 if (vendorName != null) 563 { 564 addMonitorAttribute(attrs, 565 ATTR_VENDOR_NAME, 566 INFO_GENERAL_DISPNAME_VENDOR_NAME.get(), 567 INFO_GENERAL_DESC_VENDOR_NAME.get(), 568 vendorName); 569 } 570 571 if (versionString != null) 572 { 573 addMonitorAttribute(attrs, 574 ATTR_VERSION, 575 INFO_GENERAL_DISPNAME_VERSION.get(), 576 INFO_GENERAL_DESC_VERSION.get(), 577 versionString); 578 } 579 580 if (instanceName != null) 581 { 582 addMonitorAttribute(attrs, 583 ATTR_INSTANCE_NAME, 584 INFO_GENERAL_DISPNAME_INSTANCE_NAME.get(), 585 INFO_GENERAL_DESC_INSTANCE_NAME.get(), 586 instanceName); 587 } 588 589 if (startTime != null) 590 { 591 addMonitorAttribute(attrs, 592 ATTR_START_TIME, 593 INFO_GENERAL_DISPNAME_START_TIME.get(), 594 INFO_GENERAL_DESC_START_TIME.get(), 595 startTime); 596 } 597 598 if (startupID != null) 599 { 600 addMonitorAttribute(attrs, 601 ATTR_STARTUP_ID, 602 INFO_GENERAL_DISPNAME_STARTUP_ID.get(), 603 INFO_GENERAL_DESC_STARTUP_ID.get(), 604 startupID); 605 } 606 607 if (startupUUID != null) 608 { 609 addMonitorAttribute(attrs, 610 ATTR_STARTUP_UUID, 611 INFO_GENERAL_DISPNAME_STARTUP_UUID.get(), 612 INFO_GENERAL_DESC_STARTUP_UUID.get(), 613 startupUUID); 614 } 615 616 if (currentTime != null) 617 { 618 addMonitorAttribute(attrs, 619 ATTR_CURRENT_TIME, 620 INFO_GENERAL_DISPNAME_CURRENT_TIME.get(), 621 INFO_GENERAL_DESC_CURRENT_TIME.get(), 622 currentTime); 623 } 624 625 if (uptime != null) 626 { 627 addMonitorAttribute(attrs, 628 ATTR_UP_TIME, 629 INFO_GENERAL_DISPNAME_UPTIME.get(), 630 INFO_GENERAL_DESC_UPTIME.get(), 631 uptime); 632 } 633 634 if ((startTime != null) && (currentTime != null)) 635 { 636 addMonitorAttribute(attrs, 637 "upTimeMillis", 638 INFO_GENERAL_DISPNAME_UPTIME_MILLIS.get(), 639 INFO_GENERAL_DESC_UPTIME_MILLIS.get(), 640 Long.valueOf(currentTime.getTime() - startTime.getTime())); 641 } 642 643 if (currentConnections != null) 644 { 645 addMonitorAttribute(attrs, 646 ATTR_CURRENT_CONNECTIONS, 647 INFO_GENERAL_DISPNAME_CURRENT_CONNECTIONS.get(), 648 INFO_GENERAL_DESC_CURRENT_CONNECTIONS.get(), 649 currentConnections); 650 } 651 652 if (maxConnections != null) 653 { 654 addMonitorAttribute(attrs, 655 ATTR_MAX_CONNECTIONS, 656 INFO_GENERAL_DISPNAME_MAX_CONNECTIONS.get(), 657 INFO_GENERAL_DESC_MAX_CONNECTIONS.get(), 658 maxConnections); 659 } 660 661 if (totalConnections != null) 662 { 663 addMonitorAttribute(attrs, 664 ATTR_TOTAL_CONNECTIONS, 665 INFO_GENERAL_DISPNAME_TOTAL_CONNECTIONS.get(), 666 INFO_GENERAL_DESC_TOTAL_CONNECTIONS.get(), 667 totalConnections); 668 } 669 670 if (! degradedAlertTypes.isEmpty()) 671 { 672 addMonitorAttribute(attrs, 673 ATTR_DEGRADED_ALERT_TYPE, 674 INFO_GENERAL_DISPNAME_DEGRADED_ALERT_TYPE.get(), 675 INFO_GENERAL_DESC_DEGRADED_ALERT_TYPE.get(), 676 degradedAlertTypes); 677 } 678 679 if (! unavailableAlertTypes.isEmpty()) 680 { 681 addMonitorAttribute(attrs, 682 ATTR_UNAVAILABLE_ALERT_TYPE, 683 INFO_GENERAL_DISPNAME_UNAVAILABLE_ALERT_TYPE.get(), 684 INFO_GENERAL_DESC_UNAVAILABLE_ALERT_TYPE.get(), 685 unavailableAlertTypes); 686 } 687 688 if (! thirdPartyExtensionDNs.isEmpty()) 689 { 690 addMonitorAttribute(attrs, 691 ATTR_THIRD_PARTY_EXTENSION_DN, 692 INFO_GENERAL_DISPNAME_THIRD_PARTY_EXTENSION_DN.get(), 693 INFO_GENERAL_DESC_THIRD_PARTY_EXTENSION_DN.get(), 694 thirdPartyExtensionDNs); 695 } 696 697 return Collections.unmodifiableMap(attrs); 698 } 699 }