Remove rabbitmq_stream_prometheus plugin
All these metrics, except publishers & consumers, are handled by rabbitmq_global_metrics, so we currently have duplicates. As I started removing these, I realised that tests were written in Java - why not Erlang? - and they seemed way too complicated for what was needed. After the new rabbitmq_global_metrics, we are left with 2 metrics, and all the extra code simply doesn't justify them. I am proposing that we add them to rabbit_global_counters as gauges. Let's discuss @dcorbacho @acogoluegnes Signed-off-by: Gerhard Lazu <gerhard@lazu.co.uk>
This commit is contained in:
parent
c7971252cd
commit
fae836f1c6
|
@ -77,7 +77,6 @@ ALL_PLUGINS = [
|
|||
"//deps/rabbitmq_stomp:bazel_erlang_lib",
|
||||
"//deps/rabbitmq_stream:bazel_erlang_lib",
|
||||
"//deps/rabbitmq_stream_management:bazel_erlang_lib",
|
||||
"//deps/rabbitmq_stream_prometheus:bazel_erlang_lib",
|
||||
"//deps/rabbitmq_top:bazel_erlang_lib",
|
||||
"//deps/rabbitmq_tracing:bazel_erlang_lib",
|
||||
"//deps/rabbitmq_trust_store:bazel_erlang_lib",
|
||||
|
|
|
@ -1,56 +0,0 @@
|
|||
.eunit
|
||||
*.o
|
||||
*.beam
|
||||
*.plt
|
||||
erl_crash.dump
|
||||
.concrete/DEV_MODE
|
||||
|
||||
# rebar 2.x
|
||||
.rebar
|
||||
rel/example_project
|
||||
ebin/*.beam
|
||||
deps
|
||||
|
||||
# rebar 3
|
||||
.rebar3
|
||||
_build/
|
||||
_checkouts/
|
||||
|
||||
erl_crash.dump
|
||||
.sw?
|
||||
.*.sw?
|
||||
*.beam
|
||||
/.erlang.mk/
|
||||
/cover/
|
||||
/deps/
|
||||
/ebin/
|
||||
/logs/
|
||||
/plugins/
|
||||
/xrefr
|
||||
elvis
|
||||
callgrind*
|
||||
ct.coverdata
|
||||
test/ct.cover.spec
|
||||
_build
|
||||
|
||||
rabbitmq_stream.d
|
||||
*.plt
|
||||
*.d
|
||||
|
||||
*.jar
|
||||
|
||||
|
||||
*~
|
||||
.sw?
|
||||
.*.sw?
|
||||
*.beam
|
||||
*.class
|
||||
*.dat
|
||||
*.dump
|
||||
*.iml
|
||||
*.ipr
|
||||
*.iws
|
||||
.DS_Store
|
||||
\#~
|
||||
/.idea/
|
||||
/deps/
|
|
@ -1,55 +0,0 @@
|
|||
load("@bazel-erlang//:xref.bzl", "xref")
|
||||
load("@bazel-erlang//:dialyze.bzl", "dialyze")
|
||||
load(
|
||||
"//:rabbitmq.bzl",
|
||||
"RABBITMQ_DIALYZER_OPTS",
|
||||
"broker_for_integration_suites",
|
||||
"rabbitmq_integration_suite",
|
||||
"rabbitmq_lib",
|
||||
)
|
||||
|
||||
APP_NAME = "rabbitmq_stream_prometheus"
|
||||
|
||||
APP_DESCRIPTION = "RabbitMQ Stream Prometheus"
|
||||
|
||||
APP_MODULE = "rabbit_stream_prometheus"
|
||||
|
||||
BUILD_DEPS = [
|
||||
"//deps/rabbit_common:bazel_erlang_lib",
|
||||
"@prometheus//:bazel_erlang_lib",
|
||||
]
|
||||
|
||||
DEPS = [
|
||||
"//deps/rabbitmq_prometheus:bazel_erlang_lib",
|
||||
"//deps/rabbitmq_stream:bazel_erlang_lib",
|
||||
]
|
||||
|
||||
RUNTIME_DEPS = [
|
||||
"//deps/rabbit:bazel_erlang_lib",
|
||||
]
|
||||
|
||||
rabbitmq_lib(
|
||||
app_description = APP_DESCRIPTION,
|
||||
app_module = APP_MODULE,
|
||||
app_name = APP_NAME,
|
||||
build_deps = BUILD_DEPS,
|
||||
runtime_deps = RUNTIME_DEPS,
|
||||
deps = DEPS,
|
||||
)
|
||||
|
||||
xref(tags = ["xref"])
|
||||
|
||||
dialyze(
|
||||
dialyzer_opts = RABBITMQ_DIALYZER_OPTS,
|
||||
plt = "//:base_plt",
|
||||
tags = ["dialyze"],
|
||||
)
|
||||
|
||||
broker_for_integration_suites()
|
||||
|
||||
PACKAGE = "deps/rabbitmq_stream_prometheus"
|
||||
|
||||
rabbitmq_integration_suite(
|
||||
PACKAGE,
|
||||
name = "prometheus_http_SUITE",
|
||||
)
|
|
@ -1,5 +0,0 @@
|
|||
This package, the RabbitMQ server is licensed under the MPL 2.0. For the
|
||||
MPL 2.0, please see LICENSE-MPL-RabbitMQ.
|
||||
|
||||
If you have any questions regarding licensing, please contact us at
|
||||
info@rabbitmq.com.
|
|
@ -1,370 +0,0 @@
|
|||
Mozilla Public License Version 2.0
|
||||
==================================
|
||||
|
||||
1. Definitions
|
||||
--------------
|
||||
|
||||
1.1. "Contributor"
|
||||
means each individual or legal entity that creates, contributes to
|
||||
the creation of, or owns Covered Software.
|
||||
|
||||
1.2. "Contributor Version"
|
||||
means the combination of the Contributions of others (if any) used
|
||||
by a Contributor and that particular Contributor's Contribution.
|
||||
|
||||
1.3. "Contribution"
|
||||
means Covered Software of a particular Contributor.
|
||||
|
||||
1.4. "Covered Software"
|
||||
means Source Code Form to which the initial Contributor has attached
|
||||
the notice in Exhibit A, the Executable Form of such Source Code
|
||||
Form, and Modifications of such Source Code Form, in each case
|
||||
including portions thereof.
|
||||
|
||||
1.5. "Incompatible With Secondary Licenses"
|
||||
means
|
||||
|
||||
(a) that the initial Contributor has attached the notice described
|
||||
in Exhibit B to the Covered Software; or
|
||||
|
||||
(b) that the Covered Software was made available under the terms of
|
||||
version 1.1 or earlier of the License, but not also under the
|
||||
terms of a Secondary License.
|
||||
|
||||
1.6. "Executable Form"
|
||||
means any form of the work other than Source Code Form.
|
||||
|
||||
1.7. "Larger Work"
|
||||
means a work that combines Covered Software with other material, in
|
||||
a separate file or files, that is not Covered Software.
|
||||
|
||||
1.8. "License"
|
||||
means this document.
|
||||
|
||||
1.9. "Licensable"
|
||||
means having the right to grant, to the maximum extent possible,
|
||||
whether at the time of the initial grant or subsequently, any and
|
||||
all of the rights conveyed by this License.
|
||||
|
||||
1.10. "Modifications"
|
||||
means any of the following:
|
||||
|
||||
(a) any file in Source Code Form that results from an addition to,
|
||||
deletion from, or modification of the contents of Covered
|
||||
Software; or
|
||||
|
||||
(b) any new file in Source Code Form that contains any Covered
|
||||
Software.
|
||||
|
||||
1.11. "Patent Claims" of a Contributor
|
||||
means any patent claim(s), including without limitation, method,
|
||||
process, and apparatus claims, in any patent Licensable by such
|
||||
Contributor that would be infringed, but for the grant of the
|
||||
License, by the making, using, selling, offering for sale, having
|
||||
made, import, or transfer of either its Contributions or its
|
||||
Contributor Version.
|
||||
|
||||
1.12. "Secondary License"
|
||||
means either the GNU General Public License, Version 2.0, the GNU
|
||||
Lesser General Public License, Version 2.1, the GNU Affero General
|
||||
Public License, Version 3.0, or any later versions of those
|
||||
licenses.
|
||||
|
||||
1.13. "Source Code Form"
|
||||
means the form of the work preferred for making modifications.
|
||||
|
||||
1.14. "You" (or "Your")
|
||||
means an individual or a legal entity exercising rights under this
|
||||
License. For legal entities, "You" includes any entity that
|
||||
controls, is controlled by, or is under common control with You. For
|
||||
purposes of this definition, "control" means (a) the power, direct
|
||||
or indirect, to cause the direction or management of such entity,
|
||||
whether by contract or otherwise, or (b) ownership of more than
|
||||
fifty percent (50%) of the outstanding shares or beneficial
|
||||
ownership of such entity.
|
||||
|
||||
2. License Grants and Conditions
|
||||
--------------------------------
|
||||
|
||||
2.1. Grants
|
||||
|
||||
Each Contributor hereby grants You a world-wide, royalty-free,
|
||||
non-exclusive license:
|
||||
|
||||
(a) under intellectual property rights (other than patent or trademark)
|
||||
Licensable by such Contributor to use, reproduce, make available,
|
||||
modify, display, perform, distribute, and otherwise exploit its
|
||||
Contributions, either on an unmodified basis, with Modifications, or
|
||||
as part of a Larger Work; and
|
||||
|
||||
(b) under Patent Claims of such Contributor to make, use, sell, offer
|
||||
for sale, have made, import, and otherwise transfer either its
|
||||
Contributions or its Contributor Version.
|
||||
|
||||
2.2. Effective Date
|
||||
|
||||
The licenses granted in Section 2.1 with respect to any Contribution
|
||||
become effective for each Contribution on the date the Contributor first
|
||||
distributes such Contribution.
|
||||
|
||||
2.3. Limitations on Grant Scope
|
||||
|
||||
The licenses granted in this Section 2 are the only rights granted under
|
||||
this License. No additional rights or licenses will be implied from the
|
||||
distribution or licensing of Covered Software under this License.
|
||||
Notwithstanding Section 2.1(b) above, no patent license is granted by a
|
||||
Contributor:
|
||||
|
||||
(a) for any code that a Contributor has removed from Covered Software;
|
||||
or
|
||||
|
||||
(b) for infringements caused by: (i) Your and any other third party's
|
||||
modifications of Covered Software, or (ii) the combination of its
|
||||
Contributions with other software (except as part of its Contributor
|
||||
Version); or
|
||||
|
||||
(c) under Patent Claims infringed by Covered Software in the absence of
|
||||
its Contributions.
|
||||
|
||||
This License does not grant any rights in the trademarks, service marks,
|
||||
or logos of any Contributor (except as may be necessary to comply with
|
||||
the notice requirements in Section 3.4).
|
||||
|
||||
2.4. Subsequent Licenses
|
||||
|
||||
No Contributor makes additional grants as a result of Your choice to
|
||||
distribute the Covered Software under a subsequent version of this
|
||||
License (see Section 10.2) or under the terms of a Secondary License (if
|
||||
permitted under the terms of Section 3.3).
|
||||
|
||||
2.5. Representation
|
||||
|
||||
Each Contributor represents that the Contributor believes its
|
||||
Contributions are its original creation(s) or it has sufficient rights
|
||||
to grant the rights to its Contributions conveyed by this License.
|
||||
|
||||
2.6. Fair Use
|
||||
|
||||
This License is not intended to limit any rights You have under
|
||||
applicable copyright doctrines of fair use, fair dealing, or other
|
||||
equivalents.
|
||||
|
||||
2.7. Conditions
|
||||
|
||||
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
|
||||
in Section 2.1.
|
||||
|
||||
3. Responsibilities
|
||||
-------------------
|
||||
|
||||
3.1. Distribution of Source Form
|
||||
|
||||
All distribution of Covered Software in Source Code Form, including any
|
||||
Modifications that You create or to which You contribute, must be under
|
||||
the terms of this License. You must inform recipients that the Source
|
||||
Code Form of the Covered Software is governed by the terms of this
|
||||
License, and how they can obtain a copy of this License. You may not
|
||||
attempt to alter or restrict the recipients' rights in the Source Code
|
||||
Form.
|
||||
|
||||
3.2. Distribution of Executable Form
|
||||
|
||||
If You distribute Covered Software in Executable Form then:
|
||||
|
||||
(a) such Covered Software must also be made available in Source Code
|
||||
Form, as described in Section 3.1, and You must inform recipients of
|
||||
the Executable Form how they can obtain a copy of such Source Code
|
||||
Form by reasonable means in a timely manner, at a charge no more
|
||||
than the cost of distribution to the recipient; and
|
||||
|
||||
(b) You may distribute such Executable Form under the terms of this
|
||||
License, or sublicense it under different terms, provided that the
|
||||
license for the Executable Form does not attempt to limit or alter
|
||||
the recipients' rights in the Source Code Form under this License.
|
||||
|
||||
3.3. Distribution of a Larger Work
|
||||
|
||||
You may create and distribute a Larger Work under terms of Your choice,
|
||||
provided that You also comply with the requirements of this License for
|
||||
the Covered Software. If the Larger Work is a combination of Covered
|
||||
Software with a work governed by one or more Secondary Licenses, and the
|
||||
Covered Software is not Incompatible With Secondary Licenses, this
|
||||
License permits You to additionally distribute such Covered Software
|
||||
under the terms of such Secondary License(s), so that the recipient of
|
||||
the Larger Work may, at their option, further distribute the Covered
|
||||
Software under the terms of either this License or such Secondary
|
||||
License(s).
|
||||
|
||||
3.4. Notices
|
||||
|
||||
You may not remove or alter the substance of any license notices
|
||||
(including copyright notices, patent notices, disclaimers of warranty,
|
||||
or limitations of liability) contained within the Source Code Form of
|
||||
the Covered Software, except that You may alter any license notices to
|
||||
the extent required to remedy known factual inaccuracies.
|
||||
|
||||
3.5. Application of Additional Terms
|
||||
|
||||
You may choose to offer, and to charge a fee for, warranty, support,
|
||||
indemnity or liability obligations to one or more recipients of Covered
|
||||
Software. However, You may do so only on Your own behalf, and not on
|
||||
behalf of any Contributor. You must make it absolutely clear that any
|
||||
such warranty, support, indemnity, or liability obligation is offered by
|
||||
You alone, and You hereby agree to indemnify every Contributor for any
|
||||
liability incurred by such Contributor as a result of warranty, support,
|
||||
indemnity or liability terms You offer. You may include additional
|
||||
disclaimers of warranty and limitations of liability specific to any
|
||||
jurisdiction.
|
||||
|
||||
4. Inability to Comply Due to Statute or Regulation
|
||||
---------------------------------------------------
|
||||
|
||||
If it is impossible for You to comply with any of the terms of this
|
||||
License with respect to some or all of the Covered Software due to
|
||||
statute, judicial order, or regulation then You must: (a) comply with
|
||||
the terms of this License to the maximum extent possible; and (b)
|
||||
describe the limitations and the code they affect. Such description must
|
||||
be placed in a text file included with all distributions of the Covered
|
||||
Software under this License. Except to the extent prohibited by statute
|
||||
or regulation, such description must be sufficiently detailed for a
|
||||
recipient of ordinary skill to be able to understand it.
|
||||
|
||||
5. Termination
|
||||
--------------
|
||||
|
||||
5.1. The rights granted under this License will terminate automatically
|
||||
if You fail to comply with any of its terms. However, if You become
|
||||
compliant, then the rights granted under this License from a particular
|
||||
Contributor are reinstated (a) provisionally, unless and until such
|
||||
Contributor explicitly and finally terminates Your grants, and (b) on an
|
||||
ongoing basis, if such Contributor fails to notify You of the
|
||||
non-compliance by some reasonable means prior to 60 days after You have
|
||||
come back into compliance. Moreover, Your grants from a particular
|
||||
Contributor are reinstated on an ongoing basis if such Contributor
|
||||
notifies You of the non-compliance by some reasonable means, this is the
|
||||
first time You have received notice of non-compliance with this License
|
||||
from such Contributor, and You become compliant prior to 30 days after
|
||||
Your receipt of the notice.
|
||||
|
||||
5.2. If You initiate litigation against any entity by asserting a patent
|
||||
infringement claim (excluding declaratory judgment actions,
|
||||
counter-claims, and cross-claims) alleging that a Contributor Version
|
||||
directly or indirectly infringes any patent, then the rights granted to
|
||||
You by any and all Contributors for the Covered Software under Section
|
||||
2.1 of this License shall terminate.
|
||||
|
||||
5.3. In the event of termination under Sections 5.1 or 5.2 above, all
|
||||
end user license agreements (excluding distributors and resellers) which
|
||||
have been validly granted by You or Your distributors under this License
|
||||
prior to termination shall survive termination.
|
||||
|
||||
************************************************************************
|
||||
* *
|
||||
* 6. Disclaimer of Warranty *
|
||||
* ------------------------- *
|
||||
* *
|
||||
* Covered Software is provided under this License on an "as is" *
|
||||
* basis, without warranty of any kind, either expressed, implied, or *
|
||||
* statutory, including, without limitation, warranties that the *
|
||||
* Covered Software is free of defects, merchantable, fit for a *
|
||||
* particular purpose or non-infringing. The entire risk as to the *
|
||||
* quality and performance of the Covered Software is with You. *
|
||||
* Should any Covered Software prove defective in any respect, You *
|
||||
* (not any Contributor) assume the cost of any necessary servicing, *
|
||||
* repair, or correction. This disclaimer of warranty constitutes an *
|
||||
* essential part of this License. No use of any Covered Software is *
|
||||
* authorized under this License except under this disclaimer. *
|
||||
* *
|
||||
************************************************************************
|
||||
|
||||
************************************************************************
|
||||
* *
|
||||
* 7. Limitation of Liability *
|
||||
* -------------------------- *
|
||||
* *
|
||||
* Under no circumstances and under no legal theory, whether tort *
|
||||
* (including negligence), contract, or otherwise, shall any *
|
||||
* Contributor, or anyone who distributes Covered Software as *
|
||||
* permitted above, be liable to You for any direct, indirect, *
|
||||
* special, incidental, or consequential damages of any character *
|
||||
* including, without limitation, damages for lost profits, loss of *
|
||||
* goodwill, work stoppage, computer failure or malfunction, or any *
|
||||
* and all other commercial damages or losses, even if such party *
|
||||
* shall have been informed of the possibility of such damages. This *
|
||||
* limitation of liability shall not apply to liability for death or *
|
||||
* personal injury resulting from such party's negligence to the *
|
||||
* extent applicable law prohibits such limitation. Some *
|
||||
* jurisdictions do not allow the exclusion or limitation of *
|
||||
* incidental or consequential damages, so this exclusion and *
|
||||
* limitation may not apply to You. *
|
||||
* *
|
||||
************************************************************************
|
||||
|
||||
8. Litigation
|
||||
-------------
|
||||
|
||||
Any litigation relating to this License may be brought only in the
|
||||
courts of a jurisdiction where the defendant maintains its principal
|
||||
place of business and such litigation shall be governed by laws of that
|
||||
jurisdiction, without reference to its conflict-of-law provisions.
|
||||
Nothing in this Section shall prevent a party's ability to bring
|
||||
cross-claims or counter-claims.
|
||||
|
||||
9. Miscellaneous
|
||||
----------------
|
||||
|
||||
This License represents the complete agreement concerning the subject
|
||||
matter hereof. If any provision of this License is held to be
|
||||
unenforceable, such provision shall be reformed only to the extent
|
||||
necessary to make it enforceable. Any law or regulation which provides
|
||||
that the language of a contract shall be construed against the drafter
|
||||
shall not be used to construe this License against a Contributor.
|
||||
|
||||
10. Versions of the License
|
||||
---------------------------
|
||||
|
||||
10.1. New Versions
|
||||
|
||||
Mozilla Foundation is the license steward. Except as provided in Section
|
||||
10.3, no one other than the license steward has the right to modify or
|
||||
publish new versions of this License. Each version will be given a
|
||||
distinguishing version number.
|
||||
|
||||
10.2. Effect of New Versions
|
||||
|
||||
You may distribute the Covered Software under the terms of the version
|
||||
of the License under which You originally received the Covered Software,
|
||||
or under the terms of any subsequent version published by the license
|
||||
steward.
|
||||
|
||||
10.3. Modified Versions
|
||||
|
||||
If you create software not governed by this License, and you want to
|
||||
create a new license for such software, you may create and use a
|
||||
modified version of this License if you rename the license and remove
|
||||
any references to the name of the license steward (except to note that
|
||||
such modified license differs from this License).
|
||||
|
||||
10.4. Distributing Source Code Form that is Incompatible With Secondary
|
||||
Licenses
|
||||
|
||||
If You choose to distribute Source Code Form that is Incompatible With
|
||||
Secondary Licenses under the terms of this version of the License, the
|
||||
notice described in Exhibit B of this License must be attached.
|
||||
|
||||
Exhibit A - Source Code Form License Notice
|
||||
-------------------------------------------
|
||||
|
||||
This Source Code Form is subject to the terms of the Mozilla Public
|
||||
License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
If it is not possible or desirable to put the notice in a particular
|
||||
file, then You may include the notice in a location (such as a LICENSE
|
||||
file in a relevant directory) where a recipient would be likely to look
|
||||
for such a notice.
|
||||
|
||||
The Original Code is RabbitMQ.
|
||||
|
||||
The Initial Developer of the Original Code is Pivotal Software, Inc.
|
||||
Copyright (c) 2020 VMware, Inc or its affiliates. All rights reserved.
|
|
@ -1,24 +0,0 @@
|
|||
PROJECT = rabbitmq_stream_prometheus
|
||||
PROJECT_DESCRIPTION = RabbitMQ Stream Prometheus
|
||||
PROJECT_MOD = rabbit_stream_prometheus
|
||||
|
||||
define PROJECT_ENV
|
||||
[
|
||||
]
|
||||
endef
|
||||
|
||||
|
||||
DEPS = rabbit rabbitmq_prometheus rabbitmq_stream
|
||||
TEST_DEPS = rabbitmq_ct_helpers rabbitmq_ct_client_helpers
|
||||
|
||||
DEP_EARLY_PLUGINS = rabbit_common/mk/rabbitmq-early-plugin.mk
|
||||
DEP_PLUGINS = rabbit_common/mk/rabbitmq-plugin.mk
|
||||
|
||||
# FIXME: Use erlang.mk patched for RabbitMQ, while waiting for PRs to be
|
||||
# reviewed and merged.
|
||||
|
||||
ERLANG_MK_REPO = https://github.com/rabbitmq/erlang.mk.git
|
||||
ERLANG_MK_COMMIT = rabbitmq-tmp
|
||||
|
||||
include ../../rabbitmq-components.mk
|
||||
include ../../erlang.mk
|
|
@ -1,23 +0,0 @@
|
|||
= RabbitMQ Stream Prometheus Plugin
|
||||
|
||||
== Project Maturity
|
||||
|
||||
The project is in early stages of development and is considered experimental.
|
||||
It is not ready for production use.
|
||||
|
||||
== Support
|
||||
|
||||
* For questions: https://groups.google.com/forum/#!forum/rabbitmq-users[RabbitMQ Users]
|
||||
* For bugs and feature requests: https://github.com/rabbitmq/rabbitmq-server/issues[GitHub Issues]
|
||||
|
||||
The project is currently under development, there is no guarantee yet that it will be maintained and supported
|
||||
in the future (read: you are welcome to experiment with it and give feedback, but please do not base
|
||||
your whole business on it).
|
||||
|
||||
== Licensing
|
||||
|
||||
Released under the link:LICENSE-MPL-RabbitMQ[MPL 2.0].
|
||||
|
||||
== Copyright
|
||||
|
||||
(c) 2020-2021 VMware, Inc. or its affiliates.
|
|
@ -1,12 +0,0 @@
|
|||
{plugins, [rebar3_format]}.
|
||||
|
||||
{format, [
|
||||
{files, ["src/*.erl", "src/collectors/*.erl", "test/*.erl"]},
|
||||
{formatter, default_formatter},
|
||||
{options, #{
|
||||
paper => 80,
|
||||
ribbon => 70,
|
||||
inline_attributes => {when_under, 1},
|
||||
inline_items => {when_under, 4}
|
||||
}}
|
||||
]}.
|
|
@ -1,176 +0,0 @@
|
|||
%% The contents of this file are subject to the Mozilla Public License
|
||||
%% Version 2.0 (the "License"); you may not use this file except in
|
||||
%% compliance with the License. You may obtain a copy of the License
|
||||
%% at https://www.mozilla.org/en-US/MPL/2.0/
|
||||
%%
|
||||
%% Software distributed under the License is distributed on an "AS IS"
|
||||
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
|
||||
%% the License for the specific language governing rights and
|
||||
%% limitations under the License.
|
||||
%%
|
||||
%% The Original Code is RabbitMQ.
|
||||
%%
|
||||
%% The Initial Developer of the Original Code is Pivotal Software, Inc.
|
||||
%% Copyright (c) 2021 VMware, Inc. or its affiliates. All rights reserved.
|
||||
%%
|
||||
|
||||
-module(prometheus_rabbitmq_stream_collector).
|
||||
|
||||
-export([deregister_cleanup/1,
|
||||
collect_mf/2,
|
||||
collect_metrics/2]).
|
||||
|
||||
-include_lib("prometheus/include/prometheus.hrl").
|
||||
-include_lib("rabbit_common/include/rabbit.hrl").
|
||||
-include_lib("rabbitmq_stream/include/rabbit_stream_metrics.hrl").
|
||||
|
||||
-behaviour(prometheus_collector).
|
||||
|
||||
-define(METRIC_NAME_PREFIX, "rabbitmq_stream_").
|
||||
-define(METRICS_RAW,
|
||||
[% { ETS table, [ {index, Prometheus metrics name, type, help, key} ] }
|
||||
{?TABLE_PUBLISHER,
|
||||
[{2, publishers, gauge, "Number of publishers", publishers},
|
||||
{2,
|
||||
publishers_messages_published_total,
|
||||
counter,
|
||||
"Total number of messages published to streams",
|
||||
published},
|
||||
{2,
|
||||
publishers_messages_confirmed_total,
|
||||
counter,
|
||||
"Total number of messages confirmed",
|
||||
confirmed},
|
||||
{2,
|
||||
publishers_messages_errored_total,
|
||||
counter,
|
||||
"Total number of messages errored",
|
||||
errored}]},
|
||||
{?TABLE_CONSUMER,
|
||||
[{2, consumers, gauge, "Number of consumers", consumers},
|
||||
{2,
|
||||
consumers_messages_consumed_total,
|
||||
counter,
|
||||
"Total number of messages from streams",
|
||||
consumed}]}]).
|
||||
|
||||
%% Collector API
|
||||
|
||||
deregister_cleanup(_) ->
|
||||
ok.
|
||||
|
||||
collect_mf('per-object', Callback) ->
|
||||
collect(true, Callback);
|
||||
collect_mf(_Registry, Callback) ->
|
||||
PerObjectMetrics =
|
||||
application:get_env(rabbitmq_prometheus, return_per_object_metrics,
|
||||
false),
|
||||
collect(PerObjectMetrics, Callback).
|
||||
|
||||
collect(PerObjectMetrics, Callback) ->
|
||||
[begin
|
||||
Data = get_data(Table, PerObjectMetrics),
|
||||
mf(Callback, filter_contents(Contents, PerObjectMetrics), Data)
|
||||
end
|
||||
|| {Table, Contents} <- ?METRICS_RAW],
|
||||
ok.
|
||||
|
||||
filter_contents(Contents, false) ->
|
||||
Contents;
|
||||
filter_contents(Contents, true) ->
|
||||
[E || {_, _, Type, _, _} = E <- Contents,
|
||||
Type == counter].
|
||||
|
||||
get_data(?TABLE_PUBLISHER = Table, false) ->
|
||||
{Table, A1, A2, A3, A4} =
|
||||
ets:foldl(fun({_, Props}, {T, A1, A2, A3, A4}) ->
|
||||
{T,
|
||||
A1 + 1,
|
||||
sum(proplists:get_value(published, Props), A2),
|
||||
sum(proplists:get_value(confirmed, Props), A3),
|
||||
sum(proplists:get_value(errored, Props), A4)}
|
||||
end,
|
||||
empty(Table), Table),
|
||||
[{Table,
|
||||
[{publishers, A1}, {published, A2}, {confirmed, A3}, {errored, A4}]}];
|
||||
get_data(?TABLE_CONSUMER = Table, false) ->
|
||||
{Table, A1, A2} =
|
||||
ets:foldl(fun({_, Props}, {T, A1, A2}) ->
|
||||
{T, A1 + 1, sum(proplists:get_value(consumed, Props), A2)}
|
||||
end,
|
||||
empty(Table), Table),
|
||||
[{Table, [{consumers, A1}, {consumed, A2}]}];
|
||||
get_data(Table, _) ->
|
||||
ets:tab2list(Table).
|
||||
|
||||
mf(Callback, Contents, Data) ->
|
||||
[begin
|
||||
Fun = fun(D) -> proplists:get_value(Key, element(Index, D)) end,
|
||||
Callback(prometheus_model_helpers:create_mf(?METRIC_NAME(Name),
|
||||
Help,
|
||||
catch_boolean(Type),
|
||||
?MODULE,
|
||||
{Type, Fun, Data}))
|
||||
end
|
||||
|| {Index, Name, Type, Help, Key} <- Contents].
|
||||
|
||||
collect_metrics(_Name, {Type, Fun, Items}) ->
|
||||
[metric(Type, labels(Item), Fun(Item)) || Item <- Items].
|
||||
|
||||
labels(Item) ->
|
||||
label(element(1, Item)).
|
||||
|
||||
label(#resource{virtual_host = VHost,
|
||||
kind = queue,
|
||||
name = Name}) ->
|
||||
[{vhost, VHost}, {queue, Name}];
|
||||
label({Resource, Connection, Id}) ->
|
||||
label(Resource) ++ label(Connection) ++ label(Id);
|
||||
label(P) when is_pid(P) ->
|
||||
[{connection, P}];
|
||||
label(Id) when is_integer(Id) ->
|
||||
[{id, Id}];
|
||||
label(_) ->
|
||||
[].
|
||||
|
||||
metric(counter, Labels, Value) ->
|
||||
emit_counter_metric_if_defined(Labels, Value);
|
||||
metric(gauge, Labels, Value) ->
|
||||
emit_gauge_metric_if_defined(Labels, Value).
|
||||
|
||||
emit_counter_metric_if_defined(Labels, Value) ->
|
||||
case Value of
|
||||
undefined ->
|
||||
undefined;
|
||||
'' ->
|
||||
prometheus_model_helpers:counter_metric(Labels, undefined);
|
||||
Value ->
|
||||
prometheus_model_helpers:counter_metric(Labels, Value)
|
||||
end.
|
||||
|
||||
emit_gauge_metric_if_defined(Labels, Value) ->
|
||||
case Value of
|
||||
undefined ->
|
||||
undefined;
|
||||
'' ->
|
||||
prometheus_model_helpers:gauge_metric(Labels, undefined);
|
||||
Value ->
|
||||
prometheus_model_helpers:gauge_metric(Labels, Value)
|
||||
end.
|
||||
|
||||
empty(T) when T == ?TABLE_CONSUMER ->
|
||||
{T, 0, 0};
|
||||
empty(T) when T == ?TABLE_PUBLISHER ->
|
||||
{T, 0, 0, 0, 0}.
|
||||
|
||||
sum(undefined, B) ->
|
||||
B;
|
||||
sum('', B) ->
|
||||
B;
|
||||
sum(A, B) ->
|
||||
A + B.
|
||||
|
||||
catch_boolean(boolean) ->
|
||||
untyped;
|
||||
catch_boolean(T) ->
|
||||
T.
|
|
@ -1,38 +0,0 @@
|
|||
%% The contents of this file are subject to the Mozilla Public License
|
||||
%% Version 2.0 (the "License"); you may not use this file except in
|
||||
%% compliance with the License. You may obtain a copy of the License
|
||||
%% at https://www.mozilla.org/en-US/MPL/2.0/
|
||||
%%
|
||||
%% Software distributed under the License is distributed on an "AS IS"
|
||||
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
|
||||
%% the License for the specific language governing rights and
|
||||
%% limitations under the License.
|
||||
%%
|
||||
%% The Original Code is RabbitMQ.
|
||||
%%
|
||||
%% The Initial Developer of the Original Code is Pivotal Software, Inc.
|
||||
%% Copyright (c) 2021 VMware, Inc. or its affiliates. All rights reserved.
|
||||
%%
|
||||
|
||||
-module(rabbit_stream_prometheus).
|
||||
|
||||
-behaviour(application).
|
||||
|
||||
-export([start/2]).
|
||||
-export([stop/1]).
|
||||
|
||||
-behaviour(supervisor).
|
||||
|
||||
-export([init/1]).
|
||||
|
||||
start(_Type, _Args) ->
|
||||
prometheus_registry:register_collectors([prometheus_rabbitmq_stream_collector]),
|
||||
prometheus_registry:register_collectors('per-object',
|
||||
[prometheus_rabbitmq_stream_collector]),
|
||||
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
|
||||
|
||||
stop(_State) ->
|
||||
ok.
|
||||
|
||||
init([]) ->
|
||||
{ok, {{one_for_one, 3, 10}, []}}.
|
|
@ -1,72 +0,0 @@
|
|||
%% This Source Code Form is subject to the terms of the Mozilla Public
|
||||
%% License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
%% file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
%%
|
||||
%% Copyright (c) 2007-2021 VMware, Inc. or its affiliates. All rights reserved.
|
||||
%%
|
||||
|
||||
-module(prometheus_http_SUITE).
|
||||
|
||||
-compile(export_all).
|
||||
|
||||
all() ->
|
||||
[{group, non_parallel_tests}].
|
||||
|
||||
groups() ->
|
||||
[{non_parallel_tests, [], [stream_prometheus]}].
|
||||
|
||||
%% -------------------------------------------------------------------
|
||||
%% Testsuite setup/teardown.
|
||||
%% -------------------------------------------------------------------
|
||||
|
||||
init_per_suite(Config) ->
|
||||
rabbit_ct_helpers:log_environment(),
|
||||
Config1 =
|
||||
rabbit_ct_helpers:set_config(Config,
|
||||
[{rmq_nodename_suffix, ?MODULE}]),
|
||||
rabbit_ct_helpers:run_setup_steps(Config1,
|
||||
[fun(StepConfig) ->
|
||||
rabbit_ct_helpers:merge_app_env(StepConfig,
|
||||
{rabbit,
|
||||
[{collect_statistics_interval,
|
||||
500}]})
|
||||
end]
|
||||
++ rabbit_ct_broker_helpers:setup_steps()
|
||||
++ rabbit_ct_client_helpers:setup_steps()).
|
||||
|
||||
end_per_suite(Config) ->
|
||||
rabbit_ct_helpers:run_teardown_steps(Config,
|
||||
rabbit_ct_client_helpers:teardown_steps()
|
||||
++ rabbit_ct_broker_helpers:teardown_steps()).
|
||||
|
||||
init_per_group(_, Config) ->
|
||||
Config.
|
||||
|
||||
end_per_group(_, Config) ->
|
||||
Config.
|
||||
|
||||
init_per_testcase(Testcase, Config) ->
|
||||
rabbit_ct_helpers:testcase_started(Config, Testcase).
|
||||
|
||||
end_per_testcase(Testcase, Config) ->
|
||||
rabbit_ct_helpers:testcase_finished(Config, Testcase).
|
||||
|
||||
%% -------------------------------------------------------------------
|
||||
%% Testcases.
|
||||
%% -------------------------------------------------------------------
|
||||
|
||||
stream_prometheus(Config) ->
|
||||
StreamPortNode = get_stream_port(Config),
|
||||
PrometheusPortNode = get_prometheus_port(Config),
|
||||
DataDir = rabbit_ct_helpers:get_config(Config, data_dir),
|
||||
MakeResult =
|
||||
rabbit_ct_helpers:make(Config, DataDir,
|
||||
["tests", {"STREAM_PORT=~b", [StreamPortNode]},
|
||||
{"PROMETHEUS_PORT=~b", [PrometheusPortNode]}]),
|
||||
{ok, _} = MakeResult.
|
||||
|
||||
get_stream_port(Config) ->
|
||||
rabbit_ct_broker_helpers:get_node_config(Config, 0, tcp_port_stream).
|
||||
|
||||
get_prometheus_port(Config) ->
|
||||
proplists:get_value(prometheus_port, Config, 15692).
|
|
@ -1,3 +0,0 @@
|
|||
/build/
|
||||
/lib/
|
||||
/target/
|
|
@ -1,117 +0,0 @@
|
|||
/*
|
||||
* Copyright 2007-present the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
import java.net.*;
|
||||
import java.io.*;
|
||||
import java.nio.channels.*;
|
||||
import java.util.Properties;
|
||||
|
||||
public class MavenWrapperDownloader {
|
||||
|
||||
private static final String WRAPPER_VERSION = "0.5.6";
|
||||
/**
|
||||
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
|
||||
*/
|
||||
private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
|
||||
+ WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
|
||||
|
||||
/**
|
||||
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
|
||||
* use instead of the default one.
|
||||
*/
|
||||
private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
|
||||
".mvn/wrapper/maven-wrapper.properties";
|
||||
|
||||
/**
|
||||
* Path where the maven-wrapper.jar will be saved to.
|
||||
*/
|
||||
private static final String MAVEN_WRAPPER_JAR_PATH =
|
||||
".mvn/wrapper/maven-wrapper.jar";
|
||||
|
||||
/**
|
||||
* Name of the property which should be used to override the default download url for the wrapper.
|
||||
*/
|
||||
private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
|
||||
|
||||
public static void main(String args[]) {
|
||||
System.out.println("- Downloader started");
|
||||
File baseDirectory = new File(args[0]);
|
||||
System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
|
||||
|
||||
// If the maven-wrapper.properties exists, read it and check if it contains a custom
|
||||
// wrapperUrl parameter.
|
||||
File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
|
||||
String url = DEFAULT_DOWNLOAD_URL;
|
||||
if(mavenWrapperPropertyFile.exists()) {
|
||||
FileInputStream mavenWrapperPropertyFileInputStream = null;
|
||||
try {
|
||||
mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
|
||||
Properties mavenWrapperProperties = new Properties();
|
||||
mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
|
||||
url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
|
||||
} catch (IOException e) {
|
||||
System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
|
||||
} finally {
|
||||
try {
|
||||
if(mavenWrapperPropertyFileInputStream != null) {
|
||||
mavenWrapperPropertyFileInputStream.close();
|
||||
}
|
||||
} catch (IOException e) {
|
||||
// Ignore ...
|
||||
}
|
||||
}
|
||||
}
|
||||
System.out.println("- Downloading from: " + url);
|
||||
|
||||
File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
|
||||
if(!outputFile.getParentFile().exists()) {
|
||||
if(!outputFile.getParentFile().mkdirs()) {
|
||||
System.out.println(
|
||||
"- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
|
||||
}
|
||||
}
|
||||
System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
|
||||
try {
|
||||
downloadFileFromURL(url, outputFile);
|
||||
System.out.println("Done");
|
||||
System.exit(0);
|
||||
} catch (Throwable e) {
|
||||
System.out.println("- Error downloading");
|
||||
e.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
private static void downloadFileFromURL(String urlString, File destination) throws Exception {
|
||||
if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
|
||||
String username = System.getenv("MVNW_USERNAME");
|
||||
char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
|
||||
Authenticator.setDefault(new Authenticator() {
|
||||
@Override
|
||||
protected PasswordAuthentication getPasswordAuthentication() {
|
||||
return new PasswordAuthentication(username, password);
|
||||
}
|
||||
});
|
||||
}
|
||||
URL website = new URL(urlString);
|
||||
ReadableByteChannel rbc;
|
||||
rbc = Channels.newChannel(website.openStream());
|
||||
FileOutputStream fos = new FileOutputStream(destination);
|
||||
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
|
||||
fos.close();
|
||||
rbc.close();
|
||||
}
|
||||
|
||||
}
|
Binary file not shown.
|
@ -1,2 +0,0 @@
|
|||
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
|
||||
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
|
|
@ -1,14 +0,0 @@
|
|||
export PATH :=$(CURDIR):$(PATH)
|
||||
HOSTNAME := $(shell hostname)
|
||||
MVN_FLAGS += -Dstream.port=$(STREAM_PORT) \
|
||||
-Dprometheus.port=$(PROMETHEUS_PORT)
|
||||
|
||||
.PHONY: tests clean
|
||||
|
||||
tests:
|
||||
# Note: to run a single test
|
||||
# @mvnw -q $(MVN_FLAGS) -Dtest=StreamTest#metadataOnClusterShouldReturnLeaderAndReplicas test
|
||||
@mvnw -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn -B $(MVN_FLAGS) test
|
||||
|
||||
clean:
|
||||
@mvnw clean
|
|
@ -1,310 +0,0 @@
|
|||
#!/bin/sh
|
||||
# ----------------------------------------------------------------------------
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Maven Start Up Batch script
|
||||
#
|
||||
# Required ENV vars:
|
||||
# ------------------
|
||||
# JAVA_HOME - location of a JDK home dir
|
||||
#
|
||||
# Optional ENV vars
|
||||
# -----------------
|
||||
# M2_HOME - location of maven2's installed home dir
|
||||
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
|
||||
# e.g. to debug Maven itself, use
|
||||
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
|
||||
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
|
||||
# ----------------------------------------------------------------------------
|
||||
|
||||
if [ -z "$MAVEN_SKIP_RC" ] ; then
|
||||
|
||||
if [ -f /etc/mavenrc ] ; then
|
||||
. /etc/mavenrc
|
||||
fi
|
||||
|
||||
if [ -f "$HOME/.mavenrc" ] ; then
|
||||
. "$HOME/.mavenrc"
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
# OS specific support. $var _must_ be set to either true or false.
|
||||
cygwin=false;
|
||||
darwin=false;
|
||||
mingw=false
|
||||
case "`uname`" in
|
||||
CYGWIN*) cygwin=true ;;
|
||||
MINGW*) mingw=true;;
|
||||
Darwin*) darwin=true
|
||||
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
|
||||
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
|
||||
if [ -z "$JAVA_HOME" ]; then
|
||||
if [ -x "/usr/libexec/java_home" ]; then
|
||||
export JAVA_HOME="`/usr/libexec/java_home`"
|
||||
else
|
||||
export JAVA_HOME="/Library/Java/Home"
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ -z "$JAVA_HOME" ] ; then
|
||||
if [ -r /etc/gentoo-release ] ; then
|
||||
JAVA_HOME=`java-config --jre-home`
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$M2_HOME" ] ; then
|
||||
## resolve links - $0 may be a link to maven's home
|
||||
PRG="$0"
|
||||
|
||||
# need this for relative symlinks
|
||||
while [ -h "$PRG" ] ; do
|
||||
ls=`ls -ld "$PRG"`
|
||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
||||
if expr "$link" : '/.*' > /dev/null; then
|
||||
PRG="$link"
|
||||
else
|
||||
PRG="`dirname "$PRG"`/$link"
|
||||
fi
|
||||
done
|
||||
|
||||
saveddir=`pwd`
|
||||
|
||||
M2_HOME=`dirname "$PRG"`/..
|
||||
|
||||
# make it fully qualified
|
||||
M2_HOME=`cd "$M2_HOME" && pwd`
|
||||
|
||||
cd "$saveddir"
|
||||
# echo Using m2 at $M2_HOME
|
||||
fi
|
||||
|
||||
# For Cygwin, ensure paths are in UNIX format before anything is touched
|
||||
if $cygwin ; then
|
||||
[ -n "$M2_HOME" ] &&
|
||||
M2_HOME=`cygpath --unix "$M2_HOME"`
|
||||
[ -n "$JAVA_HOME" ] &&
|
||||
JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
|
||||
[ -n "$CLASSPATH" ] &&
|
||||
CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
|
||||
fi
|
||||
|
||||
# For Mingw, ensure paths are in UNIX format before anything is touched
|
||||
if $mingw ; then
|
||||
[ -n "$M2_HOME" ] &&
|
||||
M2_HOME="`(cd "$M2_HOME"; pwd)`"
|
||||
[ -n "$JAVA_HOME" ] &&
|
||||
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
|
||||
fi
|
||||
|
||||
if [ -z "$JAVA_HOME" ]; then
|
||||
javaExecutable="`which javac`"
|
||||
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
|
||||
# readlink(1) is not available as standard on Solaris 10.
|
||||
readLink=`which readlink`
|
||||
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
|
||||
if $darwin ; then
|
||||
javaHome="`dirname \"$javaExecutable\"`"
|
||||
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
|
||||
else
|
||||
javaExecutable="`readlink -f \"$javaExecutable\"`"
|
||||
fi
|
||||
javaHome="`dirname \"$javaExecutable\"`"
|
||||
javaHome=`expr "$javaHome" : '\(.*\)/bin'`
|
||||
JAVA_HOME="$javaHome"
|
||||
export JAVA_HOME
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -z "$JAVACMD" ] ; then
|
||||
if [ -n "$JAVA_HOME" ] ; then
|
||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||
# IBM's JDK on AIX uses strange locations for the executables
|
||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||
else
|
||||
JAVACMD="$JAVA_HOME/bin/java"
|
||||
fi
|
||||
else
|
||||
JAVACMD="`which java`"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ ! -x "$JAVACMD" ] ; then
|
||||
echo "Error: JAVA_HOME is not defined correctly." >&2
|
||||
echo " We cannot execute $JAVACMD" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$JAVA_HOME" ] ; then
|
||||
echo "Warning: JAVA_HOME environment variable is not set."
|
||||
fi
|
||||
|
||||
CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
|
||||
|
||||
# traverses directory structure from process work directory to filesystem root
|
||||
# first directory with .mvn subdirectory is considered project base directory
|
||||
find_maven_basedir() {
|
||||
|
||||
if [ -z "$1" ]
|
||||
then
|
||||
echo "Path not specified to find_maven_basedir"
|
||||
return 1
|
||||
fi
|
||||
|
||||
basedir="$1"
|
||||
wdir="$1"
|
||||
while [ "$wdir" != '/' ] ; do
|
||||
if [ -d "$wdir"/.mvn ] ; then
|
||||
basedir=$wdir
|
||||
break
|
||||
fi
|
||||
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
|
||||
if [ -d "${wdir}" ]; then
|
||||
wdir=`cd "$wdir/.."; pwd`
|
||||
fi
|
||||
# end of workaround
|
||||
done
|
||||
echo "${basedir}"
|
||||
}
|
||||
|
||||
# concatenates all lines of a file
|
||||
concat_lines() {
|
||||
if [ -f "$1" ]; then
|
||||
echo "$(tr -s '\n' ' ' < "$1")"
|
||||
fi
|
||||
}
|
||||
|
||||
BASE_DIR=`find_maven_basedir "$(pwd)"`
|
||||
if [ -z "$BASE_DIR" ]; then
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
##########################################################################################
|
||||
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
|
||||
# This allows using the maven wrapper in projects that prohibit checking in binary data.
|
||||
##########################################################################################
|
||||
if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Found .mvn/wrapper/maven-wrapper.jar"
|
||||
fi
|
||||
else
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
|
||||
fi
|
||||
if [ -n "$MVNW_REPOURL" ]; then
|
||||
jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
|
||||
else
|
||||
jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
|
||||
fi
|
||||
while IFS="=" read key value; do
|
||||
case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
|
||||
esac
|
||||
done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Downloading from: $jarUrl"
|
||||
fi
|
||||
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
|
||||
if $cygwin; then
|
||||
wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
|
||||
fi
|
||||
|
||||
if command -v wget > /dev/null; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Found wget ... using wget"
|
||||
fi
|
||||
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
|
||||
wget "$jarUrl" -O "$wrapperJarPath"
|
||||
else
|
||||
wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
|
||||
fi
|
||||
elif command -v curl > /dev/null; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Found curl ... using curl"
|
||||
fi
|
||||
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
|
||||
curl -o "$wrapperJarPath" "$jarUrl" -f
|
||||
else
|
||||
curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
|
||||
fi
|
||||
|
||||
else
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo "Falling back to using Java to download"
|
||||
fi
|
||||
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
|
||||
# For Cygwin, switch paths to Windows format before running javac
|
||||
if $cygwin; then
|
||||
javaClass=`cygpath --path --windows "$javaClass"`
|
||||
fi
|
||||
if [ -e "$javaClass" ]; then
|
||||
if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo " - Compiling MavenWrapperDownloader.java ..."
|
||||
fi
|
||||
# Compiling the Java class
|
||||
("$JAVA_HOME/bin/javac" "$javaClass")
|
||||
fi
|
||||
if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
|
||||
# Running the downloader
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo " - Running MavenWrapperDownloader.java ..."
|
||||
fi
|
||||
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
##########################################################################################
|
||||
# End of extension
|
||||
##########################################################################################
|
||||
|
||||
export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
|
||||
if [ "$MVNW_VERBOSE" = true ]; then
|
||||
echo $MAVEN_PROJECTBASEDIR
|
||||
fi
|
||||
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
|
||||
|
||||
# For Cygwin, switch paths to Windows format before running java
|
||||
if $cygwin; then
|
||||
[ -n "$M2_HOME" ] &&
|
||||
M2_HOME=`cygpath --path --windows "$M2_HOME"`
|
||||
[ -n "$JAVA_HOME" ] &&
|
||||
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
|
||||
[ -n "$CLASSPATH" ] &&
|
||||
CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
|
||||
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
|
||||
MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
|
||||
fi
|
||||
|
||||
# Provide a "standardized" way to retrieve the CLI args that will
|
||||
# work with both Windows and non-Windows executions.
|
||||
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
|
||||
export MAVEN_CMD_LINE_ARGS
|
||||
|
||||
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||
|
||||
exec "$JAVACMD" \
|
||||
$MAVEN_OPTS \
|
||||
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
|
||||
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
|
||||
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
|
|
@ -1,182 +0,0 @@
|
|||
@REM ----------------------------------------------------------------------------
|
||||
@REM Licensed to the Apache Software Foundation (ASF) under one
|
||||
@REM or more contributor license agreements. See the NOTICE file
|
||||
@REM distributed with this work for additional information
|
||||
@REM regarding copyright ownership. The ASF licenses this file
|
||||
@REM to you under the Apache License, Version 2.0 (the
|
||||
@REM "License"); you may not use this file except in compliance
|
||||
@REM with the License. You may obtain a copy of the License at
|
||||
@REM
|
||||
@REM http://www.apache.org/licenses/LICENSE-2.0
|
||||
@REM
|
||||
@REM Unless required by applicable law or agreed to in writing,
|
||||
@REM software distributed under the License is distributed on an
|
||||
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
@REM KIND, either express or implied. See the License for the
|
||||
@REM specific language governing permissions and limitations
|
||||
@REM under the License.
|
||||
@REM ----------------------------------------------------------------------------
|
||||
|
||||
@REM ----------------------------------------------------------------------------
|
||||
@REM Maven Start Up Batch script
|
||||
@REM
|
||||
@REM Required ENV vars:
|
||||
@REM JAVA_HOME - location of a JDK home dir
|
||||
@REM
|
||||
@REM Optional ENV vars
|
||||
@REM M2_HOME - location of maven2's installed home dir
|
||||
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
|
||||
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
|
||||
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
|
||||
@REM e.g. to debug Maven itself, use
|
||||
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
|
||||
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
|
||||
@REM ----------------------------------------------------------------------------
|
||||
|
||||
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
|
||||
@echo off
|
||||
@REM set title of command window
|
||||
title %0
|
||||
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
|
||||
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
|
||||
|
||||
@REM set %HOME% to equivalent of $HOME
|
||||
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
|
||||
|
||||
@REM Execute a user defined script before this one
|
||||
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
|
||||
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
|
||||
if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
|
||||
if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
|
||||
:skipRcPre
|
||||
|
||||
@setlocal
|
||||
|
||||
set ERROR_CODE=0
|
||||
|
||||
@REM To isolate internal variables from possible post scripts, we use another setlocal
|
||||
@setlocal
|
||||
|
||||
@REM ==== START VALIDATION ====
|
||||
if not "%JAVA_HOME%" == "" goto OkJHome
|
||||
|
||||
echo.
|
||||
echo Error: JAVA_HOME not found in your environment. >&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||
echo location of your Java installation. >&2
|
||||
echo.
|
||||
goto error
|
||||
|
||||
:OkJHome
|
||||
if exist "%JAVA_HOME%\bin\java.exe" goto init
|
||||
|
||||
echo.
|
||||
echo Error: JAVA_HOME is set to an invalid directory. >&2
|
||||
echo JAVA_HOME = "%JAVA_HOME%" >&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||
echo location of your Java installation. >&2
|
||||
echo.
|
||||
goto error
|
||||
|
||||
@REM ==== END VALIDATION ====
|
||||
|
||||
:init
|
||||
|
||||
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
|
||||
@REM Fallback to current working directory if not found.
|
||||
|
||||
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
|
||||
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
|
||||
|
||||
set EXEC_DIR=%CD%
|
||||
set WDIR=%EXEC_DIR%
|
||||
:findBaseDir
|
||||
IF EXIST "%WDIR%"\.mvn goto baseDirFound
|
||||
cd ..
|
||||
IF "%WDIR%"=="%CD%" goto baseDirNotFound
|
||||
set WDIR=%CD%
|
||||
goto findBaseDir
|
||||
|
||||
:baseDirFound
|
||||
set MAVEN_PROJECTBASEDIR=%WDIR%
|
||||
cd "%EXEC_DIR%"
|
||||
goto endDetectBaseDir
|
||||
|
||||
:baseDirNotFound
|
||||
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
|
||||
cd "%EXEC_DIR%"
|
||||
|
||||
:endDetectBaseDir
|
||||
|
||||
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
|
||||
|
||||
@setlocal EnableExtensions EnableDelayedExpansion
|
||||
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
|
||||
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
|
||||
|
||||
:endReadAdditionalConfig
|
||||
|
||||
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
|
||||
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
|
||||
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||
|
||||
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
|
||||
|
||||
FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
|
||||
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
|
||||
)
|
||||
|
||||
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
|
||||
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
|
||||
if exist %WRAPPER_JAR% (
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Found %WRAPPER_JAR%
|
||||
)
|
||||
) else (
|
||||
if not "%MVNW_REPOURL%" == "" (
|
||||
SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
|
||||
)
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Couldn't find %WRAPPER_JAR%, downloading it ...
|
||||
echo Downloading from: %DOWNLOAD_URL%
|
||||
)
|
||||
|
||||
powershell -Command "&{"^
|
||||
"$webclient = new-object System.Net.WebClient;"^
|
||||
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
|
||||
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
|
||||
"}"^
|
||||
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
|
||||
"}"
|
||||
if "%MVNW_VERBOSE%" == "true" (
|
||||
echo Finished downloading %WRAPPER_JAR%
|
||||
)
|
||||
)
|
||||
@REM End of extension
|
||||
|
||||
@REM Provide a "standardized" way to retrieve the CLI args that will
|
||||
@REM work with both Windows and non-Windows executions.
|
||||
set MAVEN_CMD_LINE_ARGS=%*
|
||||
|
||||
%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
|
||||
if ERRORLEVEL 1 goto error
|
||||
goto end
|
||||
|
||||
:error
|
||||
set ERROR_CODE=1
|
||||
|
||||
:end
|
||||
@endlocal & set ERROR_CODE=%ERROR_CODE%
|
||||
|
||||
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
|
||||
@REM check for post script, once with legacy .bat ending and once with .cmd ending
|
||||
if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
|
||||
if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
|
||||
:skipRcPost
|
||||
|
||||
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
|
||||
if "%MAVEN_BATCH_PAUSE%" == "on" pause
|
||||
|
||||
if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
|
||||
|
||||
exit /B %ERROR_CODE%
|
|
@ -1,143 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>com.rabbitmq.stream</groupId>
|
||||
<artifactId>rabbitmq-stream-prometheus-tests</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
<licenses>
|
||||
<license>
|
||||
<name>MPL 2.0</name>
|
||||
<url>https://www.mozilla.org/en-US/MPL/2.0/</url>
|
||||
<distribution>repo</distribution>
|
||||
</license>
|
||||
</licenses>
|
||||
|
||||
<developers>
|
||||
<developer>
|
||||
<email>info@rabbitmq.com</email>
|
||||
<name>Team RabbitMQ</name>
|
||||
<organization>VMware, Inc. or its affiliates.</organization>
|
||||
<organizationUrl>https://rabbitmq.com</organizationUrl>
|
||||
</developer>
|
||||
</developers>
|
||||
|
||||
<properties>
|
||||
<stream-client.version>0.1.0-SNAPSHOT</stream-client.version>
|
||||
<proton-j.version>0.33.8</proton-j.version>
|
||||
<junit.jupiter.version>5.7.2</junit.jupiter.version>
|
||||
<assertj.version>3.19.0</assertj.version>
|
||||
<okhttp.version>4.9.1</okhttp.version>
|
||||
<logback.version>1.2.3</logback.version>
|
||||
<maven.compiler.plugin.version>3.8.1</maven.compiler.plugin.version>
|
||||
<maven-surefire-plugin.version>2.22.2</maven-surefire-plugin.version>
|
||||
<spotless.version>2.2.0</spotless.version>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.rabbitmq</groupId>
|
||||
<artifactId>stream-client</artifactId>
|
||||
<version>${stream-client.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.qpid</groupId>
|
||||
<artifactId>proton-j</artifactId>
|
||||
<version>${proton-j.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-engine</artifactId>
|
||||
<version>${junit.jupiter.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.junit.jupiter</groupId>
|
||||
<artifactId>junit-jupiter-params</artifactId>
|
||||
<version>${junit.jupiter.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.assertj</groupId>
|
||||
<artifactId>assertj-core</artifactId>
|
||||
<version>${assertj.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.squareup.okhttp3</groupId>
|
||||
<artifactId>okhttp</artifactId>
|
||||
<version>${okhttp.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
<artifactId>logback-classic</artifactId>
|
||||
<version>${logback.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
||||
<plugins>
|
||||
|
||||
<plugin>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>${maven.compiler.plugin.version}</version>
|
||||
<configuration>
|
||||
<source>1.8</source>
|
||||
<target>1.8</target>
|
||||
<compilerArgs>
|
||||
<arg>-Xlint:deprecation</arg>
|
||||
<arg>-Xlint:unchecked</arg>
|
||||
</compilerArgs>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>${maven-surefire-plugin.version}</version>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>com.diffplug.spotless</groupId>
|
||||
<artifactId>spotless-maven-plugin</artifactId>
|
||||
<version>${spotless.version}</version>
|
||||
<configuration>
|
||||
<java>
|
||||
<googleJavaFormat>
|
||||
<version>1.9</version>
|
||||
<style>GOOGLE</style>
|
||||
</googleJavaFormat>
|
||||
</java>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
</plugins>
|
||||
|
||||
</build>
|
||||
|
||||
<repositories>
|
||||
|
||||
<repository>
|
||||
<id>ossrh</id>
|
||||
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
|
||||
<snapshots><enabled>true</enabled></snapshots>
|
||||
<releases><enabled>false</enabled></releases>
|
||||
</repository>
|
||||
|
||||
</repositories>
|
||||
|
||||
</project>
|
|
@ -1,212 +0,0 @@
|
|||
// The contents of this file are subject to the Mozilla Public License
|
||||
// Version 2.0 (the "License"); you may not use this file except in
|
||||
// compliance with the License. You may obtain a copy of the License
|
||||
// at https://www.mozilla.org/en-US/MPL/2.0/
|
||||
//
|
||||
// Software distributed under the License is distributed on an "AS IS"
|
||||
// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
|
||||
// the License for the specific language governing rights and
|
||||
// limitations under the License.
|
||||
//
|
||||
// The Original Code is RabbitMQ.
|
||||
//
|
||||
// The Initial Developer of the Original Code is Pivotal Software, Inc.
|
||||
// Copyright (c) 2021 VMware, Inc. or its affiliates. All rights reserved.
|
||||
//
|
||||
|
||||
package com.rabbitmq.stream;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.StringReader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.function.BiConsumer;
|
||||
|
||||
public class MetricsUtils {
|
||||
|
||||
static final String METRIC_PREFIX = "rabbitmq_stream_";
|
||||
static final String METRIC_PUBLISHERS = "publishers";
|
||||
static final String METRIC_PUBLISHERS_PUBLISHED = "publishers_messages_published_total";
|
||||
static final String METRIC_PUBLISHERS_CONFIRMED = "publishers_messages_confirmed_total";
|
||||
static final String METRIC_PUBLISHERS_ERRORED = "publishers_messages_errored_total";
|
||||
static final String METRIC_CONSUMERS = "consumers";
|
||||
static final String METRIC_CONSUMERS_CONSUMED = "consumers_messages_consumed_total";
|
||||
static final List<String> METRICS =
|
||||
Collections.unmodifiableList(
|
||||
Arrays.asList(
|
||||
METRIC_PUBLISHERS,
|
||||
METRIC_PUBLISHERS_PUBLISHED,
|
||||
METRIC_PUBLISHERS_CONFIRMED,
|
||||
METRIC_PUBLISHERS_ERRORED,
|
||||
METRIC_CONSUMERS,
|
||||
METRIC_CONSUMERS_CONSUMED));
|
||||
|
||||
static Metrics parseMetrics(String content) throws IOException {
|
||||
Metrics metrics = new Metrics();
|
||||
try (BufferedReader reader = new BufferedReader(new StringReader(content))) {
|
||||
String line;
|
||||
String type = null, name = null;
|
||||
Metric metric = null;
|
||||
while ((line = reader.readLine()) != null) {
|
||||
if (line.trim().isEmpty()
|
||||
|| !line.contains(METRIC_PREFIX)
|
||||
|| line.contains("ct_rabbitmq_stream_prometheus")
|
||||
|| line.contains("ct-rabbitmq_stream_prometheus")) {
|
||||
// empty line, non-stream metrics,
|
||||
// or line containing the name of the erlang node, which is the name of the test suite
|
||||
// the latter shows up in some metrics
|
||||
continue;
|
||||
}
|
||||
if (line.startsWith("# TYPE ")) {
|
||||
String[] nameType = line.replace("# TYPE ", "").split(" ");
|
||||
name = nameType[0];
|
||||
type = nameType[1];
|
||||
} else if (line.startsWith("# HELP ")) {
|
||||
String help = line.replace("# HELP ", "").replace(name + " ", "");
|
||||
metric = new Metric(name, type, help);
|
||||
metrics.add(metric);
|
||||
} else if (line.startsWith(name)) {
|
||||
Map<String, String> labels = Collections.emptyMap();
|
||||
if (line.contains("{")) {
|
||||
String l = line.substring(line.indexOf("{") + 1, line.indexOf("}"));
|
||||
labels =
|
||||
Arrays.stream(l.split(","))
|
||||
.map(label -> label.trim().split("="))
|
||||
.collect(
|
||||
() -> new HashMap<>(),
|
||||
(acc, keyValue) -> acc.put(keyValue[0], keyValue[1].replace("\"", "")),
|
||||
(BiConsumer<Map<String, String>, Map<String, String>>)
|
||||
(stringStringHashMap, stringStringHashMap2) ->
|
||||
stringStringHashMap.putAll(stringStringHashMap2));
|
||||
}
|
||||
int value;
|
||||
try {
|
||||
value = Integer.valueOf(line.split(" ")[1]);
|
||||
} catch (NumberFormatException e) {
|
||||
value = 0;
|
||||
}
|
||||
metric.add(new MetricValue(value, labels));
|
||||
} else {
|
||||
throw new IllegalStateException("Cannot parse line: " + line);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return metrics;
|
||||
}
|
||||
|
||||
static class MetricValue {
|
||||
|
||||
final int value;
|
||||
final Map<String, String> labels;
|
||||
|
||||
MetricValue(int value, Map<String, String> labels) {
|
||||
this.value = value;
|
||||
this.labels = labels == null ? Collections.emptyMap() : labels;
|
||||
}
|
||||
|
||||
public int value() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "MetricValue{" + "value=" + value + ", labels=" + labels + '}';
|
||||
}
|
||||
}
|
||||
|
||||
static class Metric {
|
||||
|
||||
final String name;
|
||||
final String type;
|
||||
final String help;
|
||||
final List<MetricValue> values = new ArrayList<>();
|
||||
|
||||
Metric(String name, String type, String help) {
|
||||
this.name = name.replace(METRIC_PREFIX, "");
|
||||
this.type = type;
|
||||
this.help = help;
|
||||
}
|
||||
|
||||
void add(MetricValue value) {
|
||||
values.add(value);
|
||||
}
|
||||
|
||||
boolean isGauge() {
|
||||
return "gauge".equals(type);
|
||||
}
|
||||
|
||||
boolean isCounter() {
|
||||
return "counter".equals(type);
|
||||
}
|
||||
|
||||
int value() {
|
||||
if (values.size() != 1) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
return values.get(0).value;
|
||||
}
|
||||
|
||||
public List<MetricValue> values() {
|
||||
return values;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
if (o == null || getClass() != o.getClass()) {
|
||||
return false;
|
||||
}
|
||||
Metric metric = (Metric) o;
|
||||
return name.equals(metric.name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Metric{"
|
||||
+ "name='"
|
||||
+ name
|
||||
+ '\''
|
||||
+ ", type='"
|
||||
+ type
|
||||
+ '\''
|
||||
+ ", help='"
|
||||
+ help
|
||||
+ '\''
|
||||
+ ", values="
|
||||
+ values
|
||||
+ '}';
|
||||
}
|
||||
}
|
||||
|
||||
static class Metrics {
|
||||
|
||||
final Map<String, Metric> metrics = new HashMap<>();
|
||||
|
||||
void add(Metric metric) {
|
||||
this.metrics.put(metric.name, metric);
|
||||
}
|
||||
|
||||
Metric get(String name) {
|
||||
return metrics.get(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Metrics{" + "metrics=" + metrics + '}';
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,305 +0,0 @@
|
|||
// The contents of this file are subject to the Mozilla Public License
|
||||
// Version 2.0 (the "License"); you may not use this file except in
|
||||
// compliance with the License. You may obtain a copy of the License
|
||||
// at https://www.mozilla.org/en-US/MPL/2.0/
|
||||
//
|
||||
// Software distributed under the License is distributed on an "AS IS"
|
||||
// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
|
||||
// the License for the specific language governing rights and
|
||||
// limitations under the License.
|
||||
//
|
||||
// The Original Code is RabbitMQ.
|
||||
//
|
||||
// The Initial Developer of the Original Code is Pivotal Software, Inc.
|
||||
// Copyright (c) 2021 VMware, Inc. or its affiliates. All rights reserved.
|
||||
//
|
||||
|
||||
package com.rabbitmq.stream;
|
||||
|
||||
import static com.rabbitmq.stream.MetricsUtils.METRICS;
|
||||
import static com.rabbitmq.stream.MetricsUtils.METRIC_CONSUMERS;
|
||||
import static com.rabbitmq.stream.MetricsUtils.METRIC_CONSUMERS_CONSUMED;
|
||||
import static com.rabbitmq.stream.MetricsUtils.METRIC_PUBLISHERS;
|
||||
import static com.rabbitmq.stream.MetricsUtils.METRIC_PUBLISHERS_CONFIRMED;
|
||||
import static com.rabbitmq.stream.MetricsUtils.METRIC_PUBLISHERS_ERRORED;
|
||||
import static com.rabbitmq.stream.MetricsUtils.METRIC_PUBLISHERS_PUBLISHED;
|
||||
import static com.rabbitmq.stream.MetricsUtils.Metric;
|
||||
import static com.rabbitmq.stream.MetricsUtils.MetricValue;
|
||||
import static com.rabbitmq.stream.MetricsUtils.parseMetrics;
|
||||
import static com.rabbitmq.stream.TestUtils.counter;
|
||||
import static com.rabbitmq.stream.TestUtils.gauge;
|
||||
import static com.rabbitmq.stream.TestUtils.help;
|
||||
import static com.rabbitmq.stream.TestUtils.noValue;
|
||||
import static com.rabbitmq.stream.TestUtils.value;
|
||||
import static com.rabbitmq.stream.TestUtils.valueCount;
|
||||
import static com.rabbitmq.stream.TestUtils.valuesWithLabels;
|
||||
import static com.rabbitmq.stream.TestUtils.waitUntil;
|
||||
import static com.rabbitmq.stream.TestUtils.zero;
|
||||
import static java.util.stream.Collectors.toList;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.condition.AllOf.allOf;
|
||||
|
||||
import com.rabbitmq.stream.MetricsUtils.Metrics;
|
||||
import com.rabbitmq.stream.TestUtils.CallableSupplier;
|
||||
import java.io.IOException;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.stream.IntStream;
|
||||
import java.util.stream.Stream;
|
||||
import okhttp3.OkHttpClient;
|
||||
import okhttp3.Request;
|
||||
import okhttp3.Response;
|
||||
import okhttp3.ResponseBody;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.TestInfo;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.CsvSource;
|
||||
|
||||
public class PrometheusHttpTest {
|
||||
|
||||
static OkHttpClient httpClient = new OkHttpClient.Builder().build();
|
||||
|
||||
static String get(String endpoint) throws IOException {
|
||||
return get(httpClient, endpoint);
|
||||
}
|
||||
|
||||
static String get(OkHttpClient client, String endpoint) throws IOException {
|
||||
Request request = new Request.Builder().url(url(endpoint)).build();
|
||||
try (Response response = client.newCall(request).execute()) {
|
||||
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
|
||||
|
||||
ResponseBody body = response.body();
|
||||
return body == null ? "" : body.string();
|
||||
}
|
||||
}
|
||||
|
||||
static String url(String endpoint) {
|
||||
return "http://localhost:" + TestUtils.prometheusPort() + "/metrics" + endpoint;
|
||||
}
|
||||
|
||||
static Metrics metrics() throws IOException {
|
||||
return parseMetrics(get(""));
|
||||
}
|
||||
|
||||
static Metrics metricsPerObject() throws IOException {
|
||||
return parseMetrics(get("/per-object"));
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@CsvSource({
|
||||
METRIC_PUBLISHERS + ",true",
|
||||
METRIC_PUBLISHERS_PUBLISHED + ",false",
|
||||
METRIC_PUBLISHERS_CONFIRMED + ",false",
|
||||
METRIC_PUBLISHERS_ERRORED + ",false",
|
||||
METRIC_CONSUMERS + ",true",
|
||||
METRIC_CONSUMERS_CONSUMED + ",false"
|
||||
})
|
||||
void aggregatedMetricsWithNoConnectionShouldReturnZero(String name, boolean isGauge)
|
||||
throws Exception {
|
||||
Metrics metrics = metrics();
|
||||
assertThat(metrics.metrics).hasSameSizeAs(METRICS);
|
||||
Metric metric = metrics.get(name);
|
||||
assertThat(metric).isNotNull().has(help()).is(zero()).is(isGauge ? gauge() : counter());
|
||||
}
|
||||
|
||||
@Test
|
||||
void perObjectMetricsWithNoConnectionShouldReturnNoValue() throws Exception {
|
||||
Metrics metrics = metricsPerObject();
|
||||
METRICS.forEach(
|
||||
name -> {
|
||||
Metric metric = metrics.get(name);
|
||||
if (METRIC_PUBLISHERS.equals(name) || METRIC_CONSUMERS.equals(name)) {
|
||||
assertThat(metric).isNull();
|
||||
} else {
|
||||
assertThat(metric).isNotNull().has(noValue());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void aggregatedMetricsWithPublishersAndConsumersShouldReturnCorrectCounts(TestInfo info)
|
||||
throws Exception {
|
||||
List<String> streams =
|
||||
IntStream.range(0, 5).mapToObj(i -> TestUtils.streamName(info)).collect(toList());
|
||||
int producersCount = streams.size();
|
||||
int consumersCount = streams.size() * 2;
|
||||
int messagesByProducer = 10_000;
|
||||
int messageCount = producersCount * messagesByProducer;
|
||||
|
||||
Environment env = Environment.builder().port(TestUtils.streamPort()).build();
|
||||
List<Producer> producers = Collections.emptyList();
|
||||
List<Consumer> consumers = Collections.emptyList();
|
||||
CallableSupplier<Metrics> metricsCall = () -> metrics();
|
||||
try {
|
||||
streams.forEach(stream -> env.streamCreator().stream(stream).create());
|
||||
|
||||
producers =
|
||||
IntStream.range(0, producersCount)
|
||||
.mapToObj(i -> env.producerBuilder().stream(streams.get(i % streams.size())).build())
|
||||
.collect(toList());
|
||||
|
||||
waitUntil(() -> metricsCall.get().get(METRIC_PUBLISHERS).value() == producersCount);
|
||||
|
||||
CountDownLatch confirmedLatch = new CountDownLatch(messageCount);
|
||||
ConfirmationHandler confirmationHandler = status -> confirmedLatch.countDown();
|
||||
producers.forEach(
|
||||
producer -> {
|
||||
IntStream.range(0, messagesByProducer)
|
||||
.forEach(
|
||||
i ->
|
||||
producer.send(
|
||||
producer.messageBuilder().addData("".getBytes()).build(),
|
||||
confirmationHandler));
|
||||
});
|
||||
|
||||
assertThat(confirmedLatch.await(10, TimeUnit.SECONDS)).isTrue();
|
||||
|
||||
waitUntil(() -> metricsCall.get().get(METRIC_PUBLISHERS_CONFIRMED).value() == messageCount);
|
||||
|
||||
Metrics metrics = metricsCall.get();
|
||||
assertThat(metrics.get(METRIC_PUBLISHERS_PUBLISHED)).has(value(messageCount));
|
||||
assertThat(metrics.get(METRIC_PUBLISHERS_CONFIRMED)).has(value(messageCount));
|
||||
assertThat(metrics.get(METRIC_PUBLISHERS_ERRORED)).is(zero());
|
||||
assertThat(metrics.get(METRIC_CONSUMERS)).is(zero());
|
||||
assertThat(metrics.get(METRIC_CONSUMERS_CONSUMED)).is(zero());
|
||||
|
||||
int consumedMessageCount = consumersCount * messagesByProducer;
|
||||
CountDownLatch consumedLatch = new CountDownLatch(consumedMessageCount);
|
||||
consumers =
|
||||
IntStream.range(0, consumersCount)
|
||||
.mapToObj(
|
||||
i ->
|
||||
env.consumerBuilder().stream(streams.get(i % streams.size()))
|
||||
.offset(OffsetSpecification.first())
|
||||
.messageHandler((ctx, msg) -> consumedLatch.countDown())
|
||||
.build())
|
||||
.collect(toList());
|
||||
|
||||
assertThat(consumedLatch.await(10, TimeUnit.SECONDS)).isTrue();
|
||||
|
||||
waitUntil(
|
||||
() -> metricsCall.get().get(METRIC_CONSUMERS_CONSUMED).value() == consumedMessageCount);
|
||||
|
||||
metrics = metricsCall.get();
|
||||
assertThat(metrics.get(METRIC_CONSUMERS)).has(value(consumersCount));
|
||||
assertThat(metrics.get(METRIC_CONSUMERS_CONSUMED)).has(value(consumedMessageCount));
|
||||
|
||||
} finally {
|
||||
producers.forEach(producer -> producer.close());
|
||||
consumers.forEach(consumer -> consumer.close());
|
||||
streams.forEach(stream -> env.deleteStream(stream));
|
||||
env.close();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void perObjectMetricsWithPublishersAndConsumersShouldReturnCorrectCounts(TestInfo info)
|
||||
throws Exception {
|
||||
List<String> streams =
|
||||
IntStream.range(0, 5).mapToObj(i -> TestUtils.streamName(info)).collect(toList());
|
||||
int producersCount = streams.size();
|
||||
int consumersCount = streams.size() * 2;
|
||||
int messagesByProducer = 10_000;
|
||||
int messageCount = producersCount * messagesByProducer;
|
||||
|
||||
Environment env = Environment.builder().port(TestUtils.streamPort()).build();
|
||||
List<Producer> producers = Collections.emptyList();
|
||||
List<Consumer> consumers = Collections.emptyList();
|
||||
CallableSupplier<Metrics> metricsCall = () -> metricsPerObject();
|
||||
try {
|
||||
streams.forEach(stream -> env.streamCreator().stream(stream).create());
|
||||
|
||||
producers =
|
||||
IntStream.range(0, producersCount)
|
||||
.mapToObj(i -> env.producerBuilder().stream(streams.get(i % streams.size())).build())
|
||||
.collect(toList());
|
||||
|
||||
CountDownLatch confirmedLatch = new CountDownLatch(messageCount);
|
||||
ConfirmationHandler confirmationHandler = status -> confirmedLatch.countDown();
|
||||
producers.forEach(
|
||||
producer -> {
|
||||
IntStream.range(0, messagesByProducer)
|
||||
.forEach(
|
||||
i ->
|
||||
producer.send(
|
||||
producer.messageBuilder().addData("".getBytes()).build(),
|
||||
confirmationHandler));
|
||||
});
|
||||
|
||||
assertThat(confirmedLatch.await(10, TimeUnit.SECONDS)).isTrue();
|
||||
|
||||
waitUntil(
|
||||
() ->
|
||||
metricsCall.get().get(METRIC_PUBLISHERS_CONFIRMED).values().stream()
|
||||
.mapToInt(MetricValue::value)
|
||||
.sum()
|
||||
== messageCount);
|
||||
|
||||
Metrics metrics = metricsCall.get();
|
||||
assertThat(metrics.get(METRIC_PUBLISHERS)).isNull(); // no counters in per-object
|
||||
assertThat(metrics.get(METRIC_PUBLISHERS_PUBLISHED))
|
||||
.has(valueCount(producersCount))
|
||||
.has(valuesWithLabels("vhost", "queue", "connection", "id"))
|
||||
.has(
|
||||
allOf(
|
||||
streams.stream()
|
||||
.map(s -> value("queue", s, messagesByProducer))
|
||||
.collect(toList())));
|
||||
assertThat(metrics.get(METRIC_PUBLISHERS_CONFIRMED))
|
||||
.has(valueCount(producersCount))
|
||||
.has(valuesWithLabels("vhost", "queue", "connection", "id"))
|
||||
.has(
|
||||
allOf(
|
||||
streams.stream()
|
||||
.map(s -> value("queue", s, messagesByProducer))
|
||||
.collect(toList())));
|
||||
assertThat(metrics.get(METRIC_PUBLISHERS_ERRORED))
|
||||
.has(valueCount(producersCount))
|
||||
.has(valuesWithLabels("vhost", "queue", "connection", "id"))
|
||||
.has(allOf(streams.stream().map(s -> value("queue", s, 0)).collect(toList())));
|
||||
assertThat(metrics.get(METRIC_CONSUMERS)).isNull(); // no counters in per-object
|
||||
assertThat(metrics.get(METRIC_CONSUMERS_CONSUMED)).has(noValue());
|
||||
|
||||
int consumedMessageCount = consumersCount * messagesByProducer;
|
||||
CountDownLatch consumedLatch = new CountDownLatch(consumedMessageCount);
|
||||
consumers =
|
||||
IntStream.range(0, consumersCount)
|
||||
.mapToObj(
|
||||
i ->
|
||||
env.consumerBuilder().stream(streams.get(i % streams.size()))
|
||||
.offset(OffsetSpecification.first())
|
||||
.messageHandler((ctx, msg) -> consumedLatch.countDown())
|
||||
.build())
|
||||
.collect(toList());
|
||||
|
||||
assertThat(consumedLatch.await(10, TimeUnit.SECONDS)).isTrue();
|
||||
|
||||
waitUntil(
|
||||
() ->
|
||||
metricsCall.get().get(METRIC_CONSUMERS_CONSUMED).values().stream()
|
||||
.mapToInt(MetricValue::value)
|
||||
.sum()
|
||||
== consumedMessageCount);
|
||||
|
||||
metrics = metricsCall.get();
|
||||
assertThat(metrics.get(METRIC_CONSUMERS)).isNull(); // no counters in per-object
|
||||
assertThat(metrics.get(METRIC_CONSUMERS_CONSUMED))
|
||||
.has(valueCount(consumersCount))
|
||||
.has(valuesWithLabels("vhost", "queue", "connection", "id"))
|
||||
.has(
|
||||
allOf(
|
||||
streams.stream()
|
||||
.flatMap(s -> Stream.of(s, s))
|
||||
.map(s -> value("queue", s, messagesByProducer))
|
||||
.collect(toList())));
|
||||
|
||||
} finally {
|
||||
producers.forEach(producer -> producer.close());
|
||||
consumers.forEach(consumer -> consumer.close());
|
||||
streams.forEach(stream -> env.deleteStream(stream));
|
||||
env.close();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,138 +0,0 @@
|
|||
// The contents of this file are subject to the Mozilla Public License
|
||||
// Version 2.0 (the "License"); you may not use this file except in
|
||||
// compliance with the License. You may obtain a copy of the License
|
||||
// at https://www.mozilla.org/en-US/MPL/2.0/
|
||||
//
|
||||
// Software distributed under the License is distributed on an "AS IS"
|
||||
// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
|
||||
// the License for the specific language governing rights and
|
||||
// limitations under the License.
|
||||
//
|
||||
// The Original Code is RabbitMQ.
|
||||
//
|
||||
// The Initial Developer of the Original Code is Pivotal Software, Inc.
|
||||
// Copyright (c) 2021 VMware, Inc. or its affiliates. All rights reserved.
|
||||
//
|
||||
|
||||
package com.rabbitmq.stream;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.fail;
|
||||
|
||||
import com.rabbitmq.stream.MetricsUtils.Metric;
|
||||
import java.lang.reflect.Method;
|
||||
import java.time.Duration;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.UUID;
|
||||
import org.assertj.core.api.Condition;
|
||||
import org.junit.jupiter.api.TestInfo;
|
||||
|
||||
public class TestUtils {
|
||||
|
||||
static int streamPort() {
|
||||
String port = System.getProperty("stream.port", "5552");
|
||||
return Integer.valueOf(port);
|
||||
}
|
||||
|
||||
static int prometheusPort() {
|
||||
String port = System.getProperty("prometheus.port", "15692");
|
||||
return Integer.valueOf(port);
|
||||
}
|
||||
|
||||
static void waitUntil(CallableBooleanSupplier condition) throws Exception {
|
||||
waitAtMost(Duration.ofSeconds(10), condition);
|
||||
}
|
||||
|
||||
static void waitAtMost(Duration duration, CallableBooleanSupplier condition) throws Exception {
|
||||
if (condition.getAsBoolean()) {
|
||||
return;
|
||||
}
|
||||
int waitTime = 100;
|
||||
int waitedTime = 0;
|
||||
long timeoutInMs = duration.toMillis();
|
||||
while (waitedTime <= timeoutInMs) {
|
||||
Thread.sleep(waitTime);
|
||||
if (condition.getAsBoolean()) {
|
||||
return;
|
||||
}
|
||||
waitedTime += waitTime;
|
||||
}
|
||||
fail("Waited " + duration.getSeconds() + " second(s), condition never got true");
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
interface CallableBooleanSupplier {
|
||||
boolean getAsBoolean() throws Exception;
|
||||
}
|
||||
|
||||
@FunctionalInterface
|
||||
interface CallableSupplier<T> {
|
||||
T get() throws Exception;
|
||||
}
|
||||
|
||||
static String streamName(TestInfo info) {
|
||||
return streamName(info.getTestClass().get(), info.getTestMethod().get());
|
||||
}
|
||||
|
||||
private static String streamName(Class<?> testClass, Method testMethod) {
|
||||
String uuid = UUID.randomUUID().toString();
|
||||
return String.format(
|
||||
"%s_%s%s",
|
||||
testClass.getSimpleName(), testMethod.getName(), uuid.substring(uuid.length() / 2));
|
||||
}
|
||||
|
||||
static Condition<Metric> gauge() {
|
||||
return new Condition<>(m -> m.isGauge(), "should be a gauge");
|
||||
}
|
||||
|
||||
static Condition<Metric> counter() {
|
||||
return new Condition<>(m -> m.isCounter(), "should be a counter");
|
||||
}
|
||||
|
||||
static Condition<Metric> help() {
|
||||
return new Condition<>(m -> m.help != null, "should have a help description");
|
||||
}
|
||||
|
||||
static Condition<Metric> zero() {
|
||||
return new Condition<>(
|
||||
m -> m.values.size() == 1 && m.values.get(0).value == 0, "should have one metric at 0");
|
||||
}
|
||||
|
||||
static Condition<Metric> noValue() {
|
||||
return new Condition<>(m -> m.values.isEmpty(), "should have no value");
|
||||
}
|
||||
|
||||
static Condition<Metric> value(int expected) {
|
||||
return new Condition<>(m -> m.value() == expected, "should have value " + expected);
|
||||
}
|
||||
|
||||
static Condition<Metric> valueCount(int expected) {
|
||||
return new Condition<>(m -> m.values.size() == expected, "should have " + expected + " values");
|
||||
}
|
||||
|
||||
static Condition<Metric> valuesWithLabels(String... expectedLabels) {
|
||||
Collection<String> expected = Arrays.asList(expectedLabels);
|
||||
return new Condition<>(
|
||||
m ->
|
||||
m.values().stream()
|
||||
.map(v -> v.labels.keySet())
|
||||
.map(labels -> labels.containsAll(expected))
|
||||
.reduce(true, (b1, b2) -> b1 && b2),
|
||||
"should have values with labels " + String.join(",", expected));
|
||||
}
|
||||
|
||||
static Condition<Metric> value(String labelKey, String labelValue, int value) {
|
||||
return new Condition<>(
|
||||
m ->
|
||||
m.values().stream()
|
||||
.filter(v -> v.labels.containsKey(labelKey))
|
||||
.filter(v -> v.labels.get(labelKey).equals(labelValue))
|
||||
.filter(v -> v.value() == value)
|
||||
.count()
|
||||
>= 1,
|
||||
"should have value with %s=%s %d",
|
||||
labelKey,
|
||||
labelValue,
|
||||
value);
|
||||
}
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
<configuration>
|
||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<logger name="com.rabbitmq.stream" level="info" />
|
||||
|
||||
<root level="info">
|
||||
<appender-ref ref="STDOUT" />
|
||||
</root>
|
||||
</configuration>
|
|
@ -33,7 +33,6 @@ PLUGINS := rabbitmq_amqp1_0 \
|
|||
rabbitmq_stomp \
|
||||
rabbitmq_stream \
|
||||
rabbitmq_stream_management \
|
||||
rabbitmq_stream_prometheus \
|
||||
rabbitmq_top \
|
||||
rabbitmq_tracing \
|
||||
rabbitmq_trust_store \
|
||||
|
|
|
@ -91,7 +91,6 @@ dep_rabbitmq_stomp = git_rmq-subfolder rabbitmq-stomp $(curre
|
|||
dep_rabbitmq_stream = git_rmq-subfolder rabbitmq-stream $(current_rmq_ref) $(base_rmq_ref) master
|
||||
dep_rabbitmq_stream_common = git_rmq-subfolder rabbitmq-stream-common $(current_rmq_ref) $(base_rmq_ref) master
|
||||
dep_rabbitmq_stream_management = git_rmq-subfolder rabbitmq-stream-management $(current_rmq_ref) $(base_rmq_ref) master
|
||||
dep_rabbitmq_stream_prometheus = git_rmq-subfolder rabbitmq-stream-prometheus $(current_rmq_ref) $(base_rmq_ref) master
|
||||
dep_rabbitmq_toke = git_rmq rabbitmq-toke $(current_rmq_ref) $(base_rmq_ref) master
|
||||
dep_rabbitmq_top = git_rmq-subfolder rabbitmq-top $(current_rmq_ref) $(base_rmq_ref) master
|
||||
dep_rabbitmq_tracing = git_rmq-subfolder rabbitmq-tracing $(current_rmq_ref) $(base_rmq_ref) master
|
||||
|
@ -179,7 +178,6 @@ RABBITMQ_COMPONENTS = amqp_client \
|
|||
rabbitmq_stream \
|
||||
rabbitmq_stream_common \
|
||||
rabbitmq_stream_management \
|
||||
rabbitmq_stream_prometheus \
|
||||
rabbitmq_toke \
|
||||
rabbitmq_top \
|
||||
rabbitmq_tracing \
|
||||
|
|
Loading…
Reference in New Issue