From 32c3f44a684a1208bf9d43c18079ba45aa8e2fa6 Mon Sep 17 00:00:00 2001 From: Jonathan Ellis Date: Tue, 1 Oct 2013 14:25:42 -0500 Subject: [PATCH] Add configurable metrics reporting patch by Chris Burroughs; reviewed by Tyler Hobbs for CASSANDRA-4430 --- CHANGES.txt | 1 + NEWS.txt | 2 + build.xml | 2 + conf/metrics-reporter-config-sample.yaml | 41 ++++ lib/licenses/reporter-config-2.1.0.txt | 177 ++++++++++++++++++ lib/reporter-config-2.1.0.jar | Bin 0 -> 22291 bytes .../cassandra/service/CassandraDaemon.java | 18 ++ 7 files changed, 241 insertions(+) create mode 100644 conf/metrics-reporter-config-sample.yaml create mode 100644 lib/licenses/reporter-config-2.1.0.txt create mode 100644 lib/reporter-config-2.1.0.jar diff --git a/CHANGES.txt b/CHANGES.txt index 9bd01efb14..80aed13b9d 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 2.0.2 + * Add configurable metrics reporting (CASSANDRA-4430) * drop queries exceeding a configurable number of tombstones (CASSANDRA-6117) * Track and persist sstable read activity (CASSANDRA-5515) * Fixes for speculative retry (CASSANDRA-5932) diff --git a/NEWS.txt b/NEWS.txt index 747234fd44..6ed8449a50 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -21,6 +21,8 @@ New features ------------ - Speculative retry defaults to 99th percentile (See blog post at TODO) + - Configurable metrics reporting + (see conf/metrics-reporter-config-sample.yaml) Upgrading --------- diff --git a/build.xml b/build.xml index 5731540cd2..4be1d10f96 100644 --- a/build.xml +++ b/build.xml @@ -373,6 +373,7 @@ + @@ -452,6 +453,7 @@ + diff --git a/conf/metrics-reporter-config-sample.yaml b/conf/metrics-reporter-config-sample.yaml new file mode 100644 index 0000000000..34b1d7ef85 --- /dev/null +++ b/conf/metrics-reporter-config-sample.yaml @@ -0,0 +1,41 @@ +# For details see: +# * http://wiki.apache.org/cassandra/Metrics +# * https://github.com/addthis/metrics-reporter-config + +# This is an example file for configuring which metrics should go +# where. The sample sends everything to a flat file for humans to +# poke at. metrics-ganglia or metrics-graphite are more likely to +# operationally useful. + +# Some metrics are global for a node (KeyCache capacity) while others +# are broken down by column family or even IP. The sample list +# includes all of the global metrics via a while list. To include +# metrics for the system column family for example add +# "^org.apache.cassandra.metrics.ColumnFamily.system.+". + + +# Start Cassandra with +# -Dcassandra.metricsReporterConfigFile=metrics-reporter-config.yaml +# for this file to be used. If you are using metrics-ganglia, +# metrics-graphite, or a custom reporter you will also have to add those +# jars to the lib directory. Nothing in this file can affect +# jmx metrics. + + +console: + - + outfile: '/tmp/metrics.out' + period: 10 + timeunit: 'SECONDS' + predicate: + color: "white" + useQualifiedName: true + patterns: + - "^org.apache.cassandra.metrics.Cache.+" + - "^org.apache.cassandra.metrics.ClientRequest.+" # includes ClientRequestMetrics + - "^org.apache.cassandra.metrics.CommitLog.+" + - "^org.apache.cassandra.metrics.Compaction.+" + - "^org.apache.cassandra.metrics.DroppedMetrics.+" + - "^org.apache.cassandra.metrics.ReadRepair.+" + - "^org.apache.cassandra.metrics.Storage.+" + - "^org.apache.cassandra.metrics.ThreadPools.+" diff --git a/lib/licenses/reporter-config-2.1.0.txt b/lib/licenses/reporter-config-2.1.0.txt new file mode 100644 index 0000000000..430d42bbea --- /dev/null +++ b/lib/licenses/reporter-config-2.1.0.txt @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS diff --git a/lib/reporter-config-2.1.0.jar b/lib/reporter-config-2.1.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..0e13098cbf02134c747a9e8f990f5e6d30c422a3 GIT binary patch literal 22291 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

MtI{1}v8bYLP+ZB2G)>q5K8zfB)4FM1Z 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 LiI%k(lm7h=k!r