diff --git a/NOTICE.txt b/NOTICE.txt index 45d861cd1b8..235fb3ba393 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -9,34 +9,6 @@ Third party libraries used by the Elastic APM Server project: ================================================================================ --------------------------------------------------------------------------------- -Dependency : github.com/axiomhq/hyperloglog -Version: v0.0.0-20230201085229-3ddf4bad03dc -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/axiomhq/hyperloglog@v0.0.0-20230201085229-3ddf4bad03dc/LICENSE: - -Copyright (c) 2021, Axiom, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -------------------------------------------------------------------------------- Dependency : github.com/cespare/xxhash/v2 Version: v2.2.0 @@ -286,6 +258,108 @@ SOFTWARE. +-------------------------------------------------------------------------------- +Dependency : github.com/elastic/apm-aggregation +Version: v0.0.0-20230807142825-c82b2b7e590c +Licence type (autodetected): Elastic-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/elastic/apm-aggregation@v0.0.0-20230807142825-c82b2b7e590c/LICENSE.txt: + +Elastic License 2.0 + +URL: https://www.elastic.co/licensing/elastic-license + +## Acceptance + +By using the software, you agree to all of the terms and conditions below. + +## Copyright License + +The licensor grants you a non-exclusive, royalty-free, worldwide, +non-sublicensable, non-transferable license to use, copy, distribute, make +available, and prepare derivative works of the software, in each case subject to +the limitations and conditions below. + +## Limitations + +You may not provide the software to third parties as a hosted or managed +service, where the service provides users with access to any substantial set of +the features or functionality of the software. + +You may not move, change, disable, or circumvent the license key functionality +in the software, and you may not remove or obscure any functionality in the +software that is protected by the license key. + +You may not alter, remove, or obscure any licensing, copyright, or other notices +of the licensor in the software. Any use of the licensor’s trademarks is subject +to applicable law. + +## Patents + +The licensor grants you a license, under any patent claims the licensor can +license, or becomes able to license, to make, have made, use, sell, offer for +sale, import and have imported the software, in each case subject to the +limitations and conditions in this license. This license does not cover any +patent claims that you cause to be infringed by modifications or additions to +the software. If you or your company make any written claim that the software +infringes or contributes to infringement of any patent, your patent license for +the software granted under these terms ends immediately. If your company makes +such a claim, your patent license ends immediately for work on behalf of your +company. + +## Notices + +You must ensure that anyone who gets a copy of any part of the software from you +also gets a copy of these terms. + +If you modify the software, you must include in any modified copies of the +software prominent notices stating that you have modified the software. + +## No Other Rights + +These terms do not imply any licenses other than those expressly granted in +these terms. + +## Termination + +If you use the software in violation of these terms, such use is not licensed, +and your licenses will automatically terminate. If the licensor provides you +with a notice of your violation, and you cease all violation of this license no +later than 30 days after you receive that notice, your licenses will be +reinstated retroactively. However, if you violate these terms after such +reinstatement, any additional violation of these terms will cause your licenses +to terminate automatically and permanently. + +## No Liability + +*As far as the law allows, the software comes as is, without any warranty or +condition, and the licensor will not be liable to you for any damages arising +out of these terms or the use or nature of the software, under any kind of +legal claim.* + +## Definitions + +The **licensor** is the entity offering these terms, and the **software** is the +software the licensor makes available under these terms, including any portion +of it. + +**you** refers to the individual or entity agreeing to these terms. + +**your company** is any legal entity, sole proprietorship, or other kind of +organization that you work for, plus all organizations that have control over, +are under the control of, or are under common control with that +organization. **control** means ownership of substantially all the assets of an +entity, or the power to direct its management and policies by vote, contract, or +otherwise. Control can be direct or indirect. + +**your licenses** are all the licenses granted to you for the software under +these terms. + +**use** means anything you do with the software requiring one of your licenses. + +**trademark** means trademarks, service marks, and similar rights. + -------------------------------------------------------------------------------- Dependency : github.com/elastic/apm-data Version: v0.1.1-0.20230803060036-9180b59d7888 @@ -1808,38 +1882,6 @@ Contents of probable licence file $GOMODCACHE/github.com/elastic/go-elasticsearc limitations under the License. --------------------------------------------------------------------------------- -Dependency : github.com/elastic/go-hdrhistogram -Version: v0.1.0 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/elastic/go-hdrhistogram@v0.1.0/LICENSE: - -The MIT License (MIT) - -Copyright (c) 2014 Coda Hale -Copyright (c) 2020 Elasticsearch BV - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - -------------------------------------------------------------------------------- Dependency : github.com/elastic/go-sysinfo Version: v1.11.0 @@ -6819,11 +6861,11 @@ Indirect dependencies -------------------------------------------------------------------------------- Dependency : github.com/DataDog/zstd -Version: v1.4.4 +Version: v1.4.5 Licence type (autodetected): BSD-3-Clause -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/!data!dog/zstd@v1.4.4/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/!data!dog/zstd@v1.4.5/LICENSE: Simplified BSD License @@ -7263,16 +7305,42 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- -Dependency : github.com/cespare/xxhash -Version: v1.1.0 +Dependency : github.com/axiomhq/hyperloglog +Version: v0.0.0-20230201085229-3ddf4bad03dc Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/cespare/xxhash@v1.1.0/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/axiomhq/hyperloglog@v0.0.0-20230201085229-3ddf4bad03dc/LICENSE: -Copyright (c) 2016 Caleb Spare +Copyright (c) 2021, Axiom, Inc. -MIT License +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +-------------------------------------------------------------------------------- +Dependency : github.com/beorn7/perks +Version: v1.0.1 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/beorn7/perks@v1.0.1/LICENSE: + +Copyright (C) 2013 Blake Mizerany Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -7295,37 +7363,44 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- -Dependency : github.com/davecgh/go-spew -Version: v1.1.1 -Licence type (autodetected): ISC +Dependency : github.com/cespare/xxhash +Version: v1.1.0 +Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/davecgh/go-spew@v1.1.1/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/cespare/xxhash@v1.1.0/LICENSE.txt: -ISC License +Copyright (c) 2016 Caleb Spare -Copyright (c) 2012-2016 Dave Collins +MIT License -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- -Dependency : github.com/dgraph-io/ristretto -Version: v0.1.1 +Dependency : github.com/cockroachdb/errors +Version: v1.8.1 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/dgraph-io/ristretto@v0.1.1/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/cockroachdb/errors@v1.8.1/LICENSE: Apache License Version 2.0, January 2004 @@ -7504,354 +7579,287 @@ Contents of probable licence file $GOMODCACHE/github.com/dgraph-io/ristretto@v0. END OF TERMS AND CONDITIONS + APPENDIX: How to apply the Apache License to your work. --------------------------------------------------------------------------------- -Dependency : github.com/dgryski/go-farm -Version: v0.0.0-20200201041132-a6ae2369ad13 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -Contents of probable licence file $GOMODCACHE/github.com/dgryski/go-farm@v0.0.0-20200201041132-a6ae2369ad13/LICENSE: + Copyright [yyyy] [name of copyright owner] -Copyright (c) 2014-2017 Damian Gryski -Copyright (c) 2016-2017 Nicola Asuni - Tecnick.com + 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 -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. + 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. -------------------------------------------------------------------------------- -Dependency : github.com/dgryski/go-metro -Version: v0.0.0-20180109044635-280f6062b5bc -Licence type (autodetected): MIT +Dependency : github.com/cockroachdb/logtags +Version: v0.0.0-20190617123548-eb05cc24525f +Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/dgryski/go-metro@v0.0.0-20180109044635-280f6062b5bc/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/cockroachdb/logtags@v0.0.0-20190617123548-eb05cc24525f/LICENSE: -This package is a mechanical translation of the reference C++ code for -MetroHash, available at https://github.com/jandrewrogers/MetroHash + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -The MIT License (MIT) + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -Copyright (c) 2016 Damian Gryski + 1. Definitions. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + "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. --------------------------------------------------------------------------------- -Dependency : github.com/dlclark/regexp2 -Version: v1.8.1 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -Contents of probable licence file $GOMODCACHE/github.com/dlclark/regexp2@v1.8.1/LICENSE: + "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. -The MIT License (MIT) + "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). -Copyright (c) Doug Clark + "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. -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + "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." -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + "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. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + 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. --------------------------------------------------------------------------------- -Dependency : github.com/andrewkroh/goja -Version: v0.0.0-20190128172624-dd2ac4456e20 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- + 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: -Contents of probable licence file $GOMODCACHE/github.com/andrewkroh/goja@v0.0.0-20190128172624-dd2ac4456e20/LICENSE: + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -Copyright (c) 2016 Dmitry Panov + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -Copyright (c) 2012 Robert Krimen + (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 -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to the following conditions: + (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. -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + 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. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + 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. --------------------------------------------------------------------------------- -Dependency : github.com/dop251/goja_nodejs -Version: v0.0.0-20171011081505-adff31b136e6 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- + 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. -Contents of probable licence file $GOMODCACHE/github.com/dop251/goja_nodejs@v0.0.0-20171011081505-adff31b136e6/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. -Copyright (c) 2016 Dmitry Panov + 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. -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the Software without restriction, including without limitation -the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to the following conditions: + END OF TERMS AND CONDITIONS -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + APPENDIX: How to apply the Apache License to your work. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + Copyright [yyyy] [name of copyright owner] --------------------------------------------------------------------------------- -Dependency : github.com/eapache/go-resiliency -Version: v1.3.0 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/eapache/go-resiliency@v1.3.0/LICENSE: - -The MIT License (MIT) - -Copyright (c) 2014 Evan Huus - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - - --------------------------------------------------------------------------------- -Dependency : github.com/eapache/go-xerial-snappy -Version: v0.0.0-20230111030713-bf00bc1b83b6 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/eapache/go-xerial-snappy@v0.0.0-20230111030713-bf00bc1b83b6/LICENSE: - -The MIT License (MIT) - -Copyright (c) 2016 Evan Huus - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - --------------------------------------------------------------------------------- -Dependency : github.com/eapache/queue -Version: v1.1.0 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/eapache/queue@v1.1.0/LICENSE: - -The MIT License (MIT) - -Copyright (c) 2014 Evan Huus + 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 -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + http://www.apache.org/licenses/LICENSE-2.0 -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + 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. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -------------------------------------------------------------------------------- -Dependency : github.com/elastic/elastic-agent-shipper-client -Version: v0.5.1-0.20230228231646-f04347b666f3 -Licence type (autodetected): Elastic +Dependency : github.com/cockroachdb/pebble +Version: v0.0.0-20230627193317-c807f60529a3 +Licence type (autodetected): BSD-3-Clause -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/elastic/elastic-agent-shipper-client@v0.5.1-0.20230228231646-f04347b666f3/LICENSE.txt: - -Elastic License 2.0 - -URL: https://www.elastic.co/licensing/elastic-license - -## Acceptance - -By using the software, you agree to all of the terms and conditions below. - -## Copyright License - -The licensor grants you a non-exclusive, royalty-free, worldwide, -non-sublicensable, non-transferable license to use, copy, distribute, make -available, and prepare derivative works of the software, in each case subject to -the limitations and conditions below. - -## Limitations - -You may not provide the software to third parties as a hosted or managed -service, where the service provides users with access to any substantial set of -the features or functionality of the software. - -You may not move, change, disable, or circumvent the license key functionality -in the software, and you may not remove or obscure any functionality in the -software that is protected by the license key. - -You may not alter, remove, or obscure any licensing, copyright, or other notices -of the licensor in the software. Any use of the licensor’s trademarks is subject -to applicable law. - -## Patents - -The licensor grants you a license, under any patent claims the licensor can -license, or becomes able to license, to make, have made, use, sell, offer for -sale, import and have imported the software, in each case subject to the -limitations and conditions in this license. This license does not cover any -patent claims that you cause to be infringed by modifications or additions to -the software. If you or your company make any written claim that the software -infringes or contributes to infringement of any patent, your patent license for -the software granted under these terms ends immediately. If your company makes -such a claim, your patent license ends immediately for work on behalf of your -company. - -## Notices - -You must ensure that anyone who gets a copy of any part of the software from you -also gets a copy of these terms. - -If you modify the software, you must include in any modified copies of the -software prominent notices stating that you have modified the software. - -## No Other Rights - -These terms do not imply any licenses other than those expressly granted in -these terms. - -## Termination - -If you use the software in violation of these terms, such use is not licensed, -and your licenses will automatically terminate. If the licensor provides you -with a notice of your violation, and you cease all violation of this license no -later than 30 days after you receive that notice, your licenses will be -reinstated retroactively. However, if you violate these terms after such -reinstatement, any additional violation of these terms will cause your licenses -to terminate automatically and permanently. - -## No Liability - -*As far as the law allows, the software comes as is, without any warranty or -condition, and the licensor will not be liable to you for any damages arising -out of these terms or the use or nature of the software, under any kind of -legal claim.* +Contents of probable licence file $GOMODCACHE/github.com/cockroachdb/pebble@v0.0.0-20230627193317-c807f60529a3/LICENSE: -## Definitions - -The **licensor** is the entity offering these terms, and the **software** is the -software the licensor makes available under these terms, including any portion -of it. - -**you** refers to the individual or entity agreeing to these terms. - -**your company** is any legal entity, sole proprietorship, or other kind of -organization that you work for, plus all organizations that have control over, -are under the control of, or are under common control with that -organization. **control** means ownership of substantially all the assets of an -entity, or the power to direct its management and policies by vote, contract, or -otherwise. Control can be direct or indirect. +Copyright (c) 2011 The LevelDB-Go Authors. All rights reserved. -**your licenses** are all the licenses granted to you for the software under -these terms. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: -**use** means anything you do with the software requiring one of your licenses. + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. -**trademark** means trademarks, service marks, and similar rights. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- -Dependency : github.com/elastic/elastic-transport-go/v8 -Version: v8.3.0 +Dependency : github.com/cockroachdb/redact +Version: v1.0.8 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/elastic/elastic-transport-go/v8@v8.3.0/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/cockroachdb/redact@v1.0.8/LICENSE: Apache License Version 2.0, January 2004 @@ -8057,13 +8065,31 @@ Contents of probable licence file $GOMODCACHE/github.com/elastic/elastic-transpo -------------------------------------------------------------------------------- -Dependency : github.com/elastic/go-lumber -Version: v0.1.2-0.20220819171948-335fde24ea0f -Licence type (autodetected): Apache-2.0 +Dependency : github.com/cockroachdb/sentry-go +Version: v0.6.1-cockroachdb.2 +Licence type (autodetected): BSD-2-Clause -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/elastic/go-lumber@v0.1.2-0.20220819171948-335fde24ea0f/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/cockroachdb/sentry-go@v0.6.1-cockroachdb.2/LICENSE: + +Copyright (c) 2019 Sentry (https://sentry.io) and individual contributors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/cockroachdb/tokenbucket +Version: v0.0.0-20230613231145-182959a1fad6 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- +Contents of probable licence file $GOMODCACHE/github.com/cockroachdb/tokenbucket@v0.0.0-20230613231145-182959a1fad6/LICENSE: Apache License Version 2.0, January 2004 @@ -8269,23 +8295,48 @@ Contents of probable licence file $GOMODCACHE/github.com/elastic/go-lumber@v0.1. -------------------------------------------------------------------------------- -Dependency : github.com/elastic/go-structform -Version: v0.0.10 -Licence type (autodetected): Apache-2.0 +Dependency : github.com/davecgh/go-spew +Version: v1.1.1 +Licence type (autodetected): ISC -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/elastic/go-structform@v0.0.10/LICENSE: - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +Contents of probable licence file $GOMODCACHE/github.com/davecgh/go-spew@v1.1.1/LICENSE: - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +ISC License - 1. Definitions. +Copyright (c) 2012-2016 Dave Collins - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/dgraph-io/ristretto +Version: v0.1.1 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/dgraph-io/ristretto@v0.1.1/LICENSE: + + 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. @@ -8453,492 +8504,354 @@ Contents of probable licence file $GOMODCACHE/github.com/elastic/go-structform@v END OF TERMS AND CONDITIONS - APPENDIX: How to apply the Apache License to your work. - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +-------------------------------------------------------------------------------- +Dependency : github.com/dgryski/go-farm +Version: v0.0.0-20200201041132-a6ae2369ad13 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- - Copyright 2012–2018 Elastic +Contents of probable licence file $GOMODCACHE/github.com/dgryski/go-farm@v0.0.0-20200201041132-a6ae2369ad13/LICENSE: - 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 +Copyright (c) 2014-2017 Damian Gryski +Copyright (c) 2016-2017 Nicola Asuni - Tecnick.com - http://www.apache.org/licenses/LICENSE-2.0 +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. - 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. -------------------------------------------------------------------------------- -Dependency : github.com/elastic/go-windows -Version: v1.0.1 -Licence type (autodetected): Apache-2.0 +Dependency : github.com/dgryski/go-metro +Version: v0.0.0-20180109044635-280f6062b5bc +Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/elastic/go-windows@v1.0.1/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/dgryski/go-metro@v0.0.0-20180109044635-280f6062b5bc/LICENSE: +This package is a mechanical translation of the reference C++ code for +MetroHash, available at https://github.com/jandrewrogers/MetroHash - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +The MIT License (MIT) - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +Copyright (c) 2016 Damian Gryski - 1. Definitions. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. - "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. +-------------------------------------------------------------------------------- +Dependency : github.com/dlclark/regexp2 +Version: v1.8.1 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +Contents of probable licence file $GOMODCACHE/github.com/dlclark/regexp2@v1.8.1/LICENSE: - "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. +The MIT License (MIT) - "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). +Copyright (c) Doug Clark - "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. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - "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." +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - "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. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. - 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. +-------------------------------------------------------------------------------- +Dependency : github.com/andrewkroh/goja +Version: v0.0.0-20190128172624-dd2ac4456e20 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- - 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: +Contents of probable licence file $GOMODCACHE/github.com/andrewkroh/goja@v0.0.0-20190128172624-dd2ac4456e20/LICENSE: - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +Copyright (c) 2016 Dmitry Panov - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +Copyright (c) 2012 Robert Krimen - (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 +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to the following conditions: - (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. +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - 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. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - 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. +-------------------------------------------------------------------------------- +Dependency : github.com/dop251/goja_nodejs +Version: v0.0.0-20171011081505-adff31b136e6 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- - 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. +Contents of probable licence file $GOMODCACHE/github.com/dop251/goja_nodejs@v0.0.0-20171011081505-adff31b136e6/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. +Copyright (c) 2016 Dmitry Panov - 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. +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to the following conditions: - END OF TERMS AND CONDITIONS +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - APPENDIX: How to apply the Apache License to your work. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - Copyright [yyyy] [name of copyright owner] +-------------------------------------------------------------------------------- +Dependency : github.com/eapache/go-resiliency +Version: v1.3.0 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- - 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 +Contents of probable licence file $GOMODCACHE/github.com/eapache/go-resiliency@v1.3.0/LICENSE: - http://www.apache.org/licenses/LICENSE-2.0 +The MIT License (MIT) + +Copyright (c) 2014 Evan Huus + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. - 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. -------------------------------------------------------------------------------- -Dependency : github.com/elastic/gosigar -Version: v0.14.2 -Licence type (autodetected): Apache-2.0 +Dependency : github.com/eapache/go-xerial-snappy +Version: v0.0.0-20230111030713-bf00bc1b83b6 +Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/elastic/gosigar@v0.14.2/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/eapache/go-xerial-snappy@v0.0.0-20230111030713-bf00bc1b83b6/LICENSE: - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ +The MIT License (MIT) -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +Copyright (c) 2016 Evan Huus -1. Definitions. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. - "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. +-------------------------------------------------------------------------------- +Dependency : github.com/eapache/queue +Version: v1.1.0 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. +Contents of probable licence file $GOMODCACHE/github.com/eapache/queue@v1.1.0/LICENSE: - "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. +The MIT License (MIT) - "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). +Copyright (c) 2014 Evan Huus - "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. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: - "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." +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - "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. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -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. +-------------------------------------------------------------------------------- +Dependency : github.com/elastic/elastic-agent-shipper-client +Version: v0.5.1-0.20230228231646-f04347b666f3 +Licence type (autodetected): Elastic-2.0 +-------------------------------------------------------------------------------- -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. +Contents of probable licence file $GOMODCACHE/github.com/elastic/elastic-agent-shipper-client@v0.5.1-0.20230228231646-f04347b666f3/LICENSE.txt: -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: +Elastic License 2.0 - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and +URL: https://www.elastic.co/licensing/elastic-license - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and +## Acceptance - (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 +By using the software, you agree to all of the terms and conditions below. - (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. +## Copyright 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. +The licensor grants you a non-exclusive, royalty-free, worldwide, +non-sublicensable, non-transferable license to use, copy, distribute, make +available, and prepare derivative works of the software, in each case subject to +the limitations and conditions below. -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. +## Limitations -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. +You may not provide the software to third parties as a hosted or managed +service, where the service provides users with access to any substantial set of +the features or functionality of the software. -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. +You may not move, change, disable, or circumvent the license key functionality +in the software, and you may not remove or obscure any functionality in the +software that is protected by the license key. -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. +You may not alter, remove, or obscure any licensing, copyright, or other notices +of the licensor in the software. Any use of the licensor’s trademarks is subject +to applicable law. -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. +## Patents -END OF TERMS AND CONDITIONS +The licensor grants you a license, under any patent claims the licensor can +license, or becomes able to license, to make, have made, use, sell, offer for +sale, import and have imported the software, in each case subject to the +limitations and conditions in this license. This license does not cover any +patent claims that you cause to be infringed by modifications or additions to +the software. If you or your company make any written claim that the software +infringes or contributes to infringement of any patent, your patent license for +the software granted under these terms ends immediately. If your company makes +such a claim, your patent license ends immediately for work on behalf of your +company. -APPENDIX: How to apply the Apache License to your work. +## Notices - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +You must ensure that anyone who gets a copy of any part of the software from you +also gets a copy of these terms. -Copyright [yyyy] [name of copyright owner] +If you modify the software, you must include in any modified copies of the +software prominent notices stating that you have modified the software. -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 +## No Other Rights - http://www.apache.org/licenses/LICENSE-2.0 +These terms do not imply any licenses other than those expressly granted in +these terms. -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. +## Termination +If you use the software in violation of these terms, such use is not licensed, +and your licenses will automatically terminate. If the licensor provides you +with a notice of your violation, and you cease all violation of this license no +later than 30 days after you receive that notice, your licenses will be +reinstated retroactively. However, if you violate these terms after such +reinstatement, any additional violation of these terms will cause your licenses +to terminate automatically and permanently. --------------------------------------------------------------------------------- -Dependency : github.com/fatih/color -Version: v1.14.1 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- +## No Liability -Contents of probable licence file $GOMODCACHE/github.com/fatih/color@v1.14.1/LICENSE.md: +*As far as the law allows, the software comes as is, without any warranty or +condition, and the licensor will not be liable to you for any damages arising +out of these terms or the use or nature of the software, under any kind of +legal claim.* -The MIT License (MIT) +## Definitions -Copyright (c) 2013 Fatih Arslan +The **licensor** is the entity offering these terms, and the **software** is the +software the licensor makes available under these terms, including any portion +of it. -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: +**you** refers to the individual or entity agreeing to these terms. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +**your company** is any legal entity, sole proprietorship, or other kind of +organization that you work for, plus all organizations that have control over, +are under the control of, or are under common control with that +organization. **control** means ownership of substantially all the assets of an +entity, or the power to direct its management and policies by vote, contract, or +otherwise. Control can be direct or indirect. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +**your licenses** are all the licenses granted to you for the software under +these terms. + +**use** means anything you do with the software requiring one of your licenses. + +**trademark** means trademarks, service marks, and similar rights. -------------------------------------------------------------------------------- -Dependency : github.com/go-logr/logr -Version: v1.2.4 +Dependency : github.com/elastic/elastic-transport-go/v8 +Version: v8.3.0 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/go-logr/logr@v1.2.4/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/elastic/elastic-transport-go/v8@v8.3.0/LICENSE: Apache License Version 2.0, January 2004 @@ -9120,7 +9033,7 @@ Contents of probable licence file $GOMODCACHE/github.com/go-logr/logr@v1.2.4/LIC APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" + boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -9128,7 +9041,7 @@ Contents of probable licence file $GOMODCACHE/github.com/go-logr/logr@v1.2.4/LIC same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright {yyyy} {name of copyright owner} + Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -9144,12 +9057,13 @@ Contents of probable licence file $GOMODCACHE/github.com/go-logr/logr@v1.2.4/LIC -------------------------------------------------------------------------------- -Dependency : github.com/go-logr/stdr -Version: v1.2.2 +Dependency : github.com/elastic/go-lumber +Version: v0.1.2-0.20220819171948-335fde24ea0f Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/go-logr/stdr@v1.2.2/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/elastic/go-lumber@v0.1.2-0.20220819171948-335fde24ea0f/LICENSE: + Apache License Version 2.0, January 2004 @@ -9355,45 +9269,14 @@ Contents of probable licence file $GOMODCACHE/github.com/go-logr/stdr@v1.2.2/LIC -------------------------------------------------------------------------------- -Dependency : github.com/go-ole/go-ole -Version: v1.2.6 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/go-ole/go-ole@v1.2.6/LICENSE: - -The MIT License (MIT) - -Copyright © 2013-2017 Yasuhiro Matsumoto, - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the “Software”), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - --------------------------------------------------------------------------------- -Dependency : github.com/gogo/googleapis -Version: v1.4.1 +Dependency : github.com/elastic/go-structform +Version: v0.0.10 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/gogo/googleapis@v1.4.1/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/elastic/go-structform@v0.0.10/LICENSE: -Apache License + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -9581,8 +9464,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2015, Google Inc - Copyright 2018, GoGo Authors + Copyright 2012–2018 Elastic Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -9597,112 +9479,28 @@ Apache License limitations under the License. - -------------------------------------------------------------------------------- -Dependency : github.com/golang/glog -Version: v1.1.0 +Dependency : github.com/elastic/go-windows +Version: v1.0.1 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -No licence file provided. +Contents of probable licence file $GOMODCACHE/github.com/elastic/go-windows@v1.0.1/LICENSE.txt: --------------------------------------------------------------------------------- -Dependency : github.com/golang/protobuf -Version: v1.5.3 -Licence type (autodetected): BSD-3-Clause --------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/golang/protobuf@v1.5.3/LICENSE: + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -Copyright 2010 The Go Authors. All rights reserved. + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: + 1. Definitions. - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - --------------------------------------------------------------------------------- -Dependency : github.com/golang/snappy -Version: v0.0.4 -Licence type (autodetected): BSD-3-Clause --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/golang/snappy@v0.0.4/LICENSE: - -Copyright (c) 2011 The Snappy-Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - --------------------------------------------------------------------------------- -Dependency : github.com/gomodule/redigo -Version: v1.8.9 -Licence type (autodetected): Apache-2.0 --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/gomodule/redigo@v1.8.9/LICENSE: - - - 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. + "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 @@ -9867,787 +9665,2870 @@ Contents of probable licence file $GOMODCACHE/github.com/gomodule/redigo@v1.8.9/ END OF TERMS AND CONDITIONS + APPENDIX: How to apply the Apache License to your work. --------------------------------------------------------------------------------- -Dependency : github.com/h2non/filetype -Version: v1.1.3 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/h2non/filetype@v1.1.3/LICENSE: - -The MIT License + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -Copyright (c) Tomas Aparicio + Copyright [yyyy] [name of copyright owner] -Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the -Software is furnished to do so, subject to the following -conditions: + 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 -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. + http://www.apache.org/licenses/LICENSE-2.0 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR -OTHER DEALINGS IN THE SOFTWARE. + 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. -------------------------------------------------------------------------------- -Dependency : github.com/hashicorp/errwrap -Version: v1.1.0 -Licence type (autodetected): MPL-2.0 +Dependency : github.com/elastic/gosigar +Version: v0.14.2 +Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/hashicorp/errwrap@v1.1.0/LICENSE: - -Mozilla Public License, version 2.0 - -1. Definitions +Contents of probable licence file $GOMODCACHE/github.com/elastic/gosigar@v0.14.2/LICENSE: -1.1. “Contributor” + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ - means each individual or legal entity that creates, contributes to the - creation of, or owns Covered Software. +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -1.2. “Contributor Version” +1. Definitions. - means the combination of the Contributions of others (if any) used by a - Contributor and that particular Contributor’s Contribution. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -1.3. “Contribution” + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. - means Covered Software of a particular Contributor. + "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. -1.4. “Covered Software” + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. - 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. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -1.5. “Incompatible With Secondary Licenses” - means + "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. - a. that the initial Contributor has attached the notice described in - Exhibit B to the Covered Software; or + "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). - 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. + "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. -1.6. “Executable Form” + "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." - means any form of the work other than Source Code Form. + "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. -1.7. “Larger 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. - means a work that combines Covered Software with other material, in a separate - file or files, that is not Covered Software. +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. -1.8. “License” +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: - means this document. + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -1.9. “Licensable” + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and - 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. + (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 -1.10. “Modifications” + (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. - means any of the following: + 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. - a. any file in Source Code Form that results from an addition to, deletion - from, or modification of the contents of Covered Software; or +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. - b. any new file in Source Code Form that contains any Covered Software. +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. -1.11. “Patent Claims” of a Contributor +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. - 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. +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. -1.12. “Secondary License” +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. - 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. +END OF TERMS AND CONDITIONS -1.13. “Source Code Form” +APPENDIX: How to apply the Apache License to your work. - means the form of the work preferred for making modifications. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -1.14. “You” (or “Your”) +Copyright [yyyy] [name of copyright owner] - 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. +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 -2. License Grants and Conditions +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. -2.1. Grants - Each Contributor hereby grants You a world-wide, royalty-free, - non-exclusive license: +-------------------------------------------------------------------------------- +Dependency : github.com/fatih/color +Version: v1.14.1 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- - 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 +Contents of probable licence file $GOMODCACHE/github.com/fatih/color@v1.14.1/LICENSE.md: - 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. +The MIT License (MIT) -2.2. Effective Date +Copyright (c) 2013 Fatih Arslan - 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. +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: -2.3. Limitations on Grant Scope +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. - 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: +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - 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 +-------------------------------------------------------------------------------- +Dependency : github.com/go-logr/logr +Version: v1.2.4 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- - c. under Patent Claims infringed by Covered Software in the absence of its - Contributions. +Contents of probable licence file $GOMODCACHE/github.com/go-logr/logr@v1.2.4/LICENSE: - 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). + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -2.4. Subsequent Licenses + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - 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). + 1. Definitions. -2.5. Representation + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. - 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. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -2.6. Fair Use + "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. - This License is not intended to limit any rights You have under applicable - copyright doctrines of fair use, fair dealing, or other equivalents. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -2.7. Conditions + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. - Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in - Section 2.1. + "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). -3. Responsibilities + "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. -3.1. Distribution of Source Form + "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." - 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. + "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. -3.2. Distribution of Executable Form + 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. - If You distribute Covered Software in Executable Form then: + 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. - 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 + 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 + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + 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. + + +-------------------------------------------------------------------------------- +Dependency : github.com/go-logr/stdr +Version: v1.2.2 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/go-logr/stdr@v1.2.2/LICENSE: + + 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 + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + + +-------------------------------------------------------------------------------- +Dependency : github.com/go-ole/go-ole +Version: v1.2.6 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/go-ole/go-ole@v1.2.6/LICENSE: + +The MIT License (MIT) + +Copyright © 2013-2017 Yasuhiro Matsumoto, + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the “Software”), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/gogo/googleapis +Version: v1.4.1 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/gogo/googleapis@v1.4.1/LICENSE: + +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 + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2015, Google Inc + Copyright 2018, GoGo 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. + + + +-------------------------------------------------------------------------------- +Dependency : github.com/golang/glog +Version: v1.1.0 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- + +No licence file provided. + +-------------------------------------------------------------------------------- +Dependency : github.com/golang/protobuf +Version: v1.5.3 +Licence type (autodetected): BSD-3-Clause +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/golang/protobuf@v1.5.3/LICENSE: + +Copyright 2010 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + + +-------------------------------------------------------------------------------- +Dependency : github.com/golang/snappy +Version: v0.0.4 +Licence type (autodetected): BSD-3-Clause +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/golang/snappy@v0.0.4/LICENSE: + +Copyright (c) 2011 The Snappy-Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/gomodule/redigo +Version: v1.8.9 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/gomodule/redigo@v1.8.9/LICENSE: + + + 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 + + +-------------------------------------------------------------------------------- +Dependency : github.com/h2non/filetype +Version: v1.1.3 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/h2non/filetype@v1.1.3/LICENSE: + +The MIT License + +Copyright (c) Tomas Aparicio + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/hashicorp/errwrap +Version: v1.1.0 +Licence type (autodetected): MPL-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/hashicorp/errwrap@v1.1.0/LICENSE: + +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 +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. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - “Incompatible With Secondary Licenses” Notice + + This Source Code Form is “Incompatible + With Secondary Licenses”, as defined by + the Mozilla Public License, v. 2.0. + + + +-------------------------------------------------------------------------------- +Dependency : github.com/hashicorp/go-uuid +Version: v1.0.3 +Licence type (autodetected): MPL-2.0 +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/hashicorp/go-uuid@v1.0.3/LICENSE: + +Copyright © 2015-2022 HashiCorp, Inc. + +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. - 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). +10.3. Modified Versions -3.4. Notices + 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). - 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. +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. -3.5. Application of Additional Terms +Exhibit A - Source Code Form License Notice - 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. + 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/. -4. Inability to Comply Due to Statute or Regulation +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. - 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. +You may add additional accurate notices of copyright ownership. -5. Termination +Exhibit B - "Incompatible With Secondary Licenses" Notice -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. + This Source Code Form is "Incompatible + With Secondary Licenses", as defined by + the Mozilla Public License, v. 2.0. -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 +-------------------------------------------------------------------------------- +Dependency : github.com/inconshreveable/mousetrap +Version: v1.1.0 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- - 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. +Contents of probable licence file $GOMODCACHE/github.com/inconshreveable/mousetrap@v1.1.0/LICENSE: -7. Limitation of Liability + 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. - 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. 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. -8. Litigation + 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. - 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. + END OF TERMS AND CONDITIONS -9. Miscellaneous + APPENDIX: How to apply the Apache License to your work. - 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. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + Copyright 2022 Alan Shreve (@inconshreveable) -10. Versions of the License + 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 -10.1. New Versions + http://www.apache.org/licenses/LICENSE-2.0 - 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. + 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. -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. +-------------------------------------------------------------------------------- +Dependency : github.com/jcmturner/aescts/v2 +Version: v2.0.0 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- -10.3. Modified Versions +Contents of probable licence file $GOMODCACHE/github.com/jcmturner/aescts/v2@v2.0.0/LICENSE: - 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). + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -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. + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -Exhibit A - Source Code Form License Notice + 1. Definitions. - 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/. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -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. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -You may add additional accurate notices of copyright ownership. + "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. -Exhibit B - “Incompatible With Secondary Licenses” Notice + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. - This Source Code Form is “Incompatible - With Secondary Licenses”, as defined by - the Mozilla Public License, v. 2.0. + "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). --------------------------------------------------------------------------------- -Dependency : github.com/hashicorp/go-uuid -Version: v1.0.3 -Licence type (autodetected): MPL-2.0 --------------------------------------------------------------------------------- + "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. -Contents of probable licence file $GOMODCACHE/github.com/hashicorp/go-uuid@v1.0.3/LICENSE: + "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." -Copyright © 2015-2022 HashiCorp, Inc. + "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. -Mozilla Public License, version 2.0 + 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. -1. Definitions + 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. -1.1. "Contributor" + 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: - means each individual or legal entity that creates, contributes to the - creation of, or owns Covered Software. + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and -1.2. "Contributor Version" + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and - means the combination of the Contributions of others (if any) used by a - Contributor and that particular Contributor's Contribution. + (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 -1.3. "Contribution" + (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. - means Covered Software of a particular Contributor. + 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. -1.4. "Covered Software" + 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. - 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. + 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. -1.5. "Incompatible With Secondary Licenses" - means + 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. - a. that the initial Contributor has attached the notice described in - Exhibit B to the Covered Software; or + 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. - 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. + 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. -1.6. "Executable Form" + END OF TERMS AND CONDITIONS - means any form of the work other than Source Code Form. + APPENDIX: How to apply the Apache License to your work. -1.7. "Larger Work" + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. - means a work that combines Covered Software with other material, in a - separate file or files, that is not Covered Software. + Copyright {yyyy} {name of copyright owner} -1.8. "License" + 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 - means this document. + http://www.apache.org/licenses/LICENSE-2.0 -1.9. "Licensable" + 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. - 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" +-------------------------------------------------------------------------------- +Dependency : github.com/jcmturner/dnsutils/v2 +Version: v2.0.0 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- - means any of the following: +Contents of probable licence file $GOMODCACHE/github.com/jcmturner/dnsutils/v2@v2.0.0/LICENSE: - a. any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered Software; or + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ - b. any new file in Source Code Form that contains any Covered Software. + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -1.11. "Patent Claims" of a Contributor + 1. Definitions. - 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. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -1.12. "Secondary License" + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the 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. + "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. -1.13. "Source Code Form" + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. - means the form of the work preferred for making modifications. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -1.14. "You" (or "Your") + "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. - 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. + "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. -2. License Grants and Conditions + "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." -2.1. Grants + "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. - Each Contributor hereby grants You a world-wide, royalty-free, - non-exclusive license: + 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. - 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 + 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. - 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. + 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: -2.2. Effective Date + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and - 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. + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and -2.3. Limitations on Grant Scope + (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 - 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: + (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. - a. for any code that a Contributor has removed from Covered Software; or + 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. - 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 + 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. - c. under Patent Claims infringed by Covered Software in the absence of - its 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. - 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). + 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. -2.4. Subsequent Licenses + 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. - 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). + 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. -2.5. Representation + END OF TERMS AND CONDITIONS - 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. + APPENDIX: How to apply the Apache License to your work. -2.6. Fair Use + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. - This License is not intended to limit any rights You have under - applicable copyright doctrines of fair use, fair dealing, or other - equivalents. + Copyright [yyyy] [name of copyright owner] -2.7. Conditions + 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 - Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in - Section 2.1. + 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. -3. Responsibilities -3.1. Distribution of Source Form +-------------------------------------------------------------------------------- +Dependency : github.com/jcmturner/gofork +Version: v1.7.6 +Licence type (autodetected): BSD-3-Clause +-------------------------------------------------------------------------------- - 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. +Contents of probable licence file $GOMODCACHE/github.com/jcmturner/gofork@v1.7.6/LICENSE: -3.2. Distribution of Executable Form +Copyright (c) 2009 The Go Authors. All rights reserved. - If You distribute Covered Software in Executable Form then: +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: - 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 + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. - 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. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -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). +-------------------------------------------------------------------------------- +Dependency : github.com/jcmturner/gokrb5/v8 +Version: v8.4.3 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- -3.4. Notices +Contents of probable licence file $GOMODCACHE/github.com/jcmturner/gokrb5/v8@v8.4.3/LICENSE: - 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. + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -3.5. Application of Additional Terms + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - 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. + 1. Definitions. -4. Inability to Comply Due to Statute or Regulation + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. - 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. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. -5. Termination + "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. -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. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. -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. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. -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. + "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. -6. Disclaimer of Warranty + "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). - 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. + "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. -7. Limitation of Liability + "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." - 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. + "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. -8. Litigation + 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. - 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. + 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. -9. Miscellaneous + 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: - 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. + (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 -10. Versions of the License + (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 -10.1. New Versions + (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. - 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. + 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. -10.2. Effect of New Versions + 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. - 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. + 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. -10.3. Modified Versions + 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. - 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). + 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. -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. + 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. -Exhibit A - Source Code Form License Notice + END OF TERMS AND CONDITIONS - 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/. + APPENDIX: How to apply the Apache License to your work. -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. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. -You may add additional accurate notices of copyright ownership. + Copyright {yyyy} {name of copyright owner} -Exhibit B - "Incompatible With Secondary Licenses" Notice + 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 - This Source Code Form is "Incompatible - With Secondary Licenses", as defined by - the Mozilla Public License, v. 2.0. + 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. -------------------------------------------------------------------------------- -Dependency : github.com/inconshreveable/mousetrap -Version: v1.1.0 +Dependency : github.com/jcmturner/rpc/v2 +Version: v2.0.3 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/inconshreveable/mousetrap@v1.1.0/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/jcmturner/rpc/v2@v2.0.3/LICENSE: Apache License Version 2.0, January 2004 @@ -10826,39 +12707,134 @@ Contents of probable licence file $GOMODCACHE/github.com/inconshreveable/mousetr END OF TERMS AND CONDITIONS - APPENDIX: How to apply the Apache License to your work. + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + + +-------------------------------------------------------------------------------- +Dependency : github.com/joeshaw/multierror +Version: v0.0.0-20140124173710-69b34d4ec901 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/joeshaw/multierror@v0.0.0-20140124173710-69b34d4ec901/LICENSE: + +The MIT License (MIT) + +Copyright (c) 2014 Joe Shaw + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/json-iterator/go +Version: v1.1.12 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/json-iterator/go@v1.1.12/LICENSE: + +MIT License + +Copyright (c) 2016 json-iterator + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. +-------------------------------------------------------------------------------- +Dependency : github.com/klauspost/compress +Version: v1.16.7 +Licence type (autodetected): Apache-2.0 +-------------------------------------------------------------------------------- - Copyright 2022 Alan Shreve (@inconshreveable) +Contents of probable licence file $GOMODCACHE/github.com/klauspost/compress@v1.16.7/LICENSE: - 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 +Copyright (c) 2012 The Go Authors. All rights reserved. +Copyright (c) 2019 Klaus Post. All rights reserved. - http://www.apache.org/licenses/LICENSE-2.0 +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: - 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. + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- -Dependency : github.com/jcmturner/aescts/v2 -Version: v2.0.0 -Licence type (autodetected): Apache-2.0 --------------------------------------------------------------------------------- +------------------ -Contents of probable licence file $GOMODCACHE/github.com/jcmturner/aescts/v2@v2.0.0/LICENSE: +Files: gzhttp/* Apache License Version 2.0, January 2004 @@ -11040,7 +13016,7 @@ Contents of probable licence file $GOMODCACHE/github.com/jcmturner/aescts/v2@v2. APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" + boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -11048,7 +13024,7 @@ Contents of probable licence file $GOMODCACHE/github.com/jcmturner/aescts/v2@v2. same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright {yyyy} {name of copyright owner} + Copyright 2016-2017 The New York Times Company Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -11062,14 +13038,192 @@ Contents of probable licence file $GOMODCACHE/github.com/jcmturner/aescts/v2@v2. See the License for the specific language governing permissions and limitations under the License. +------------------ + +Files: s2/cmd/internal/readahead/* + +The MIT License (MIT) + +Copyright (c) 2015 Klaus Post + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +--------------------- +Files: snappy/* +Files: internal/snapref/* + +Copyright (c) 2011 The Snappy-Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +----------------- + +Files: s2/cmd/internal/filepathx/* + +Copyright 2016 The filepathx Authors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + -------------------------------------------------------------------------------- -Dependency : github.com/jcmturner/dnsutils/v2 -Version: v2.0.0 +Dependency : github.com/kr/pretty +Version: v0.3.1 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/kr/pretty@v0.3.1/License: + +Copyright 2012 Keith Rarick + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/kr/text +Version: v0.2.0 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/kr/text@v0.2.0/License: + +Copyright 2012 Keith Rarick + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/mattn/go-colorable +Version: v0.1.13 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/mattn/go-colorable@v0.1.13/LICENSE: + +The MIT License (MIT) + +Copyright (c) 2016 Yasuhiro Matsumoto + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/mattn/go-isatty +Version: v0.0.17 +Licence type (autodetected): MIT +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/mattn/go-isatty@v0.0.17/LICENSE: + +Copyright (c) Yasuhiro MATSUMOTO + +MIT License (Expat) + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +-------------------------------------------------------------------------------- +Dependency : github.com/matttproud/golang_protobuf_extensions +Version: v1.0.4 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/jcmturner/dnsutils/v2@v2.0.0/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/matttproud/golang_protobuf_extensions@v1.0.4/LICENSE: Apache License Version 2.0, January 2004 @@ -11251,7 +13405,7 @@ Contents of probable licence file $GOMODCACHE/github.com/jcmturner/dnsutils/v2@v APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" + boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -11259,7 +13413,7 @@ Contents of probable licence file $GOMODCACHE/github.com/jcmturner/dnsutils/v2@v same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright {yyyy} {name of copyright owner} Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -11275,49 +13429,43 @@ Contents of probable licence file $GOMODCACHE/github.com/jcmturner/dnsutils/v2@v -------------------------------------------------------------------------------- -Dependency : github.com/jcmturner/gofork -Version: v1.7.6 -Licence type (autodetected): BSD-3-Clause +Dependency : github.com/mitchellh/hashstructure +Version: v1.1.0 +Licence type (autodetected): MIT -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/jcmturner/gofork@v1.7.6/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/mitchellh/hashstructure@v1.1.0/LICENSE: -Copyright (c) 2009 The Go Authors. All rights reserved. +The MIT License (MIT) -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: +Copyright (c) 2016 Mitchell Hashimoto - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. -------------------------------------------------------------------------------- -Dependency : github.com/jcmturner/gokrb5/v8 -Version: v8.4.3 +Dependency : github.com/modern-go/concurrent +Version: v0.0.0-20180306012644-bacd9c7ef1dd Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/jcmturner/gokrb5/v8@v8.4.3/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/modern-go/concurrent@v0.0.0-20180306012644-bacd9c7ef1dd/LICENSE: Apache License Version 2.0, January 2004 @@ -11499,7 +13647,7 @@ Contents of probable licence file $GOMODCACHE/github.com/jcmturner/gokrb5/v8@v8. APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" + boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -11507,7 +13655,7 @@ Contents of probable licence file $GOMODCACHE/github.com/jcmturner/gokrb5/v8@v8. same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright {yyyy} {name of copyright owner} + Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -11523,12 +13671,12 @@ Contents of probable licence file $GOMODCACHE/github.com/jcmturner/gokrb5/v8@v8. -------------------------------------------------------------------------------- -Dependency : github.com/jcmturner/rpc/v2 -Version: v2.0.3 +Dependency : github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal +Version: v0.81.0 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/jcmturner/rpc/v2@v2.0.3/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal@v0.81.0/LICENSE: Apache License Version 2.0, January 2004 @@ -11734,107 +13882,12 @@ Contents of probable licence file $GOMODCACHE/github.com/jcmturner/rpc/v2@v2.0.3 -------------------------------------------------------------------------------- -Dependency : github.com/joeshaw/multierror -Version: v0.0.0-20140124173710-69b34d4ec901 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/joeshaw/multierror@v0.0.0-20140124173710-69b34d4ec901/LICENSE: - -The MIT License (MIT) - -Copyright (c) 2014 Joe Shaw - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - --------------------------------------------------------------------------------- -Dependency : github.com/json-iterator/go -Version: v1.1.12 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/json-iterator/go@v1.1.12/LICENSE: - -MIT License - -Copyright (c) 2016 json-iterator - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - --------------------------------------------------------------------------------- -Dependency : github.com/klauspost/compress -Version: v1.16.7 +Dependency : github.com/opentracing/opentracing-go +Version: v1.2.0 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/klauspost/compress@v1.16.7/LICENSE: - -Copyright (c) 2012 The Go Authors. All rights reserved. -Copyright (c) 2019 Klaus Post. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ------------------- - -Files: gzhttp/* +Contents of probable licence file $GOMODCACHE/github.com/opentracing/opentracing-go@v1.2.0/LICENSE: Apache License Version 2.0, January 2004 @@ -12016,7 +14069,7 @@ Files: gzhttp/* APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" + boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -12024,7 +14077,7 @@ Files: gzhttp/* same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2016-2017 The New York Times Company + Copyright 2016 The OpenTracing Authors Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -12032,171 +14085,96 @@ Files: gzhttp/* 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. - ------------------- - -Files: s2/cmd/internal/readahead/* - -The MIT License (MIT) - -Copyright (c) 2015 Klaus Post - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ---------------------- -Files: snappy/* -Files: internal/snapref/* - -Copyright (c) 2011 The Snappy-Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ------------------ - -Files: s2/cmd/internal/filepathx/* - -Copyright 2016 The filepathx Authors - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - --------------------------------------------------------------------------------- -Dependency : github.com/mattn/go-colorable -Version: v0.1.13 -Licence type (autodetected): MIT --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/mattn/go-colorable@v0.1.13/LICENSE: - -The MIT License (MIT) - -Copyright (c) 2016 Yasuhiro Matsumoto - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + 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. -------------------------------------------------------------------------------- -Dependency : github.com/mattn/go-isatty -Version: v0.0.17 -Licence type (autodetected): MIT +Dependency : github.com/pierrec/lz4 +Version: v2.6.1+incompatible +Licence type (autodetected): BSD-3-Clause -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/mattn/go-isatty@v0.0.17/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/pierrec/lz4@v2.6.1+incompatible/LICENSE: -Copyright (c) Yasuhiro MATSUMOTO +Copyright (c) 2015, Pierre Curto +All rights reserved. -MIT License (Expat) +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of xxHash nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- -Dependency : github.com/mitchellh/hashstructure -Version: v1.1.0 -Licence type (autodetected): MIT +Dependency : github.com/pierrec/lz4/v4 +Version: v4.1.17 +Licence type (autodetected): BSD-3-Clause -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/mitchellh/hashstructure@v1.1.0/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/pierrec/lz4/v4@v4.1.17/LICENSE: -The MIT License (MIT) +Copyright (c) 2015, Pierre Curto +All rights reserved. -Copyright (c) 2016 Mitchell Hashimoto +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of xxHash nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -------------------------------------------------------------------------------- -Dependency : github.com/modern-go/concurrent -Version: v0.0.0-20180306012644-bacd9c7ef1dd +Dependency : github.com/prometheus/client_golang +Version: v1.16.0 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/modern-go/concurrent@v0.0.0-20180306012644-bacd9c7ef1dd/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/prometheus/client_golang@v1.16.0/LICENSE: Apache License Version 2.0, January 2004 @@ -12402,12 +14380,12 @@ Contents of probable licence file $GOMODCACHE/github.com/modern-go/concurrent@v0 -------------------------------------------------------------------------------- -Dependency : github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal -Version: v0.81.0 +Dependency : github.com/prometheus/client_model +Version: v0.4.0 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal@v0.81.0/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/prometheus/client_model@v0.4.0/LICENSE: Apache License Version 2.0, January 2004 @@ -12613,12 +14591,12 @@ Contents of probable licence file $GOMODCACHE/github.com/open-telemetry/opentele -------------------------------------------------------------------------------- -Dependency : github.com/opentracing/opentracing-go -Version: v1.2.0 +Dependency : github.com/prometheus/common +Version: v0.44.0 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/opentracing/opentracing-go@v1.2.0/LICENSE: +Contents of probable licence file $GOMODCACHE/github.com/prometheus/common@v0.44.0/LICENSE: Apache License Version 2.0, January 2004 @@ -12800,7 +14778,7 @@ Contents of probable licence file $GOMODCACHE/github.com/opentracing/opentracing APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" + boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -12808,7 +14786,7 @@ Contents of probable licence file $GOMODCACHE/github.com/opentracing/opentracing same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2016 The OpenTracing Authors + Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -12823,82 +14801,6 @@ Contents of probable licence file $GOMODCACHE/github.com/opentracing/opentracing limitations under the License. --------------------------------------------------------------------------------- -Dependency : github.com/pierrec/lz4 -Version: v2.6.1+incompatible -Licence type (autodetected): BSD-3-Clause --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/pierrec/lz4@v2.6.1+incompatible/LICENSE: - -Copyright (c) 2015, Pierre Curto -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of xxHash nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - --------------------------------------------------------------------------------- -Dependency : github.com/pierrec/lz4/v4 -Version: v4.1.17 -Licence type (autodetected): BSD-3-Clause --------------------------------------------------------------------------------- - -Contents of probable licence file $GOMODCACHE/github.com/pierrec/lz4/v4@v4.1.17/LICENSE: - -Copyright (c) 2015, Pierre Curto -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of xxHash nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - - -------------------------------------------------------------------------------- Dependency : github.com/prometheus/procfs Version: v0.10.1 @@ -13149,6 +15051,43 @@ are those of the authors and should not be interpreted as representing official policies, either expressed or implied, of Richard Crowley. +-------------------------------------------------------------------------------- +Dependency : github.com/rogpeppe/go-internal +Version: v1.10.0 +Licence type (autodetected): BSD-3-Clause +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/github.com/rogpeppe/go-internal@v1.10.0/LICENSE: + +Copyright (c) 2018 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + -------------------------------------------------------------------------------- Dependency : github.com/shirou/gopsutil Version: v3.21.11+incompatible @@ -16097,6 +18036,43 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-------------------------------------------------------------------------------- +Dependency : golang.org/x/exp +Version: v0.0.0-20230713183714-613f0c0eb8a1 +Licence type (autodetected): BSD-3-Clause +-------------------------------------------------------------------------------- + +Contents of probable licence file $GOMODCACHE/golang.org/x/exp@v0.0.0-20230713183714-613f0c0eb8a1/LICENSE: + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + -------------------------------------------------------------------------------- Dependency : golang.org/x/sys Version: v0.10.0 diff --git a/changelogs/head.asciidoc b/changelogs/head.asciidoc index c6734020842..1c8eeba33ab 100644 --- a/changelogs/head.asciidoc +++ b/changelogs/head.asciidoc @@ -21,3 +21,9 @@ https://github.com/elastic/apm-server/compare/8.9\...main[View commits] - Add a self-instrumentation transaction to the agent config periodic refresh action. {pull}11129[11129] - Stop dropping metadata fields from span documents. {pull}11089[11089] - Add permissions to reroute events in the integration package. {pull}11168[11168] + +[float] +==== Aggregation improvements +- Replace aggregation with LSM-based aggregator which has a lower memory footprint {pull}11117[11117] +- Add `service.language.name` to service destination metrics {pull}11117[11117] +- Modify per-service transaction groups limit to consider more than service.name; Add per-service service destination groups limit and per-service service transaction groups limit {pull}11117[11117] diff --git a/dev_docs/trace_metrics.md b/dev_docs/trace_metrics.md index 2e8c780becd..c0a77c01789 100644 --- a/dev_docs/trace_metrics.md +++ b/dev_docs/trace_metrics.md @@ -15,26 +15,19 @@ As transactions are observed by APM Server, it groups them according to various attributes such as `service.name`, `transaction.name`, and `kubernetes.pod.name`. The latency is then recorded in an [HDRHistogram](http://hdrhistogram.org/) for that group. Transaction group latency histograms are periodically indexed (every -minute by default), with configurable precision (defaults to 2 significant figures). +minute by default), with a fixed precision of 2 significant figures. To protect against memory exhaustion due to high-cardinality transaction names (or other attributes), at any given time, APM Server places a limit on the number of services tracked, the number of transaction groups tracked, as well as number -of groups tracked per service. - -By default, the limits are 1,000 services per GB of memory, 5,000 transaction groups -per GB of memory. When transaction group latency histograms are indexed, the groups -are reset, enabling a different set of groups to be recorded. -The per-service limit is 10% of the global limit. For example, for a 2GB APM Server, -the limits are 2,000 services, 10,000 transaction groups, and for each service, -there can be a maximum of 1,000 unique transaction groups. +of groups tracked per service. See [docs](https://www.elastic.co/guide/en/apm/guide/current/data-model-metrics.html#_aggregated_metrics_limits_and_overflows) for limits. ## Service transaction metrics Service transaction metrics are similar to Transaction metrics, but with fewer dimensions. For example, `transaction.name` is no longer considered during aggregation. -A limit of 1,000 unique service transaction groups per GB of memory is enforced. +See [docs](https://www.elastic.co/guide/en/apm/guide/current/data-model-metrics.html#_aggregated_metrics_limits_and_overflows) for limits. ## Service destination metrics @@ -43,15 +36,16 @@ from one service to another. This works much the same as transaction metrics aggregation: span events describing an operation that involves another service are grouped by the originating and target services, and the span latency is accumulated. For these metrics we record only a count and sum, enabling calculation -of throughput and average latency. A default limit of 10,000 groups is -imposed. +of throughput and average latency. + +See [docs](https://www.elastic.co/guide/en/apm/guide/current/data-model-metrics.html#_aggregated_metrics_limits_and_overflows) for limits. ## Service summary metrics Service summary metrics consider transaction, error, log, and metric events and basically produce a summary of all services sending events. -A limit of 1,000 unique service summary groups per GB of memory is enforced. +See [docs](https://www.elastic.co/guide/en/apm/guide/current/data-model-metrics.html#_aggregated_metrics_limits_and_overflows) for limits. ## Dealing with sampling diff --git a/docs/data-model.asciidoc b/docs/data-model.asciidoc index 362393ba9d2..918c48f2c23 100644 --- a/docs/data-model.asciidoc +++ b/docs/data-model.asciidoc @@ -461,6 +461,7 @@ You can filter and group by these dimensions: * `metricset.interval`: A string with the aggregation interval the metricset represents. * `numeric_labels`: Key-value object containing numeric labels set globally by the APM agents. * `service.environment`: The environment of the service that made the request +* `service.language.name`: The language name of the service that served the transaction, for example `Go` * `service.name`: The name of the service that made the request * `service.target.name`: The target service name, for example `customer_db` * `service.target.type`: The target service type, for example `mysql` @@ -540,12 +541,19 @@ there are limits on the number of unique groups tracked at any given time. Note that all the below limits may change in the future with further improvements. -* For transaction metrics, the limits are 1000 services per GB of APM Server, and 5000 transaction -groups per GB of APM Server. Additionally, each service may only consume up to 10% of the transaction groups, +* For all the following metrics, they share a limit of 1000 services per GB of APM Server. +** For transaction metrics, there is an additional limit of 5000 total transaction groups per GB of APM Server, +and each service may only consume up to 10% of the transaction groups, which is 500 transaction groups per service per GB of APM Server. -* For service-transaction metrics, the limit is 1000 service transaction groups per GB of APM Server. -* For service-destination metrics, the limit is a constant of 10000 service destination groups. -* For service-summary metrics, the limit is 1000 service summary groups per GB of APM Server. +** For service-transaction metrics, there is an additional limit of 1000 total service transaction groups per GB of APM Server, +and each service may only consume up to 10% of the service transaction groups, +which is 100 service transaction groups per service per GB of APM Server. +** For service-destination metrics, there is an additional limit of a constant 10000 total service destination groups, +and each service may only consume up to 10% of the service destination groups, +which is 1000 service destination groups per service. +** For service-summary metrics, there is no additional limit. + +In the above, a service is defined as a combination of `service.name`, `service.environment`, `service.language.name` and `agent.name`. [float] ===== Overflows diff --git a/docs/data/elasticsearch/service_destination_metric.json b/docs/data/elasticsearch/service_destination_metric.json index 244a991b7e0..d86d3b03c4d 100644 --- a/docs/data/elasticsearch/service_destination_metric.json +++ b/docs/data/elasticsearch/service_destination_metric.json @@ -32,6 +32,9 @@ }, "service": { "environment": "production", + "language": { + "name": "ruby" + }, "name": "opbeans-ruby", "target": { "type": "postgresql" diff --git a/go.mod b/go.mod index c997941cbec..59caef268d3 100644 --- a/go.mod +++ b/go.mod @@ -3,10 +3,10 @@ module github.com/elastic/apm-server go 1.20 require ( - github.com/axiomhq/hyperloglog v0.0.0-20230201085229-3ddf4bad03dc github.com/cespare/xxhash/v2 v2.2.0 github.com/dgraph-io/badger/v2 v2.2007.3-0.20201012072640-f5a7e0a1c83b github.com/dustin/go-humanize v1.0.1 + github.com/elastic/apm-aggregation v0.0.0-20230807142825-c82b2b7e590c github.com/elastic/apm-data v0.1.1-0.20230803060036-9180b59d7888 github.com/elastic/beats/v7 v7.0.0-alpha2.0.20230808073125-1fe462c68f7d github.com/elastic/elastic-agent-client/v7 v7.2.0 @@ -15,7 +15,6 @@ require ( github.com/elastic/gmux v0.2.0 github.com/elastic/go-docappender v0.2.1-0.20230724080315-b714d6181871 github.com/elastic/go-elasticsearch/v8 v8.9.0 - github.com/elastic/go-hdrhistogram v0.1.0 github.com/elastic/go-sysinfo v1.11.0 github.com/elastic/go-ucfg v0.8.6 github.com/go-sourcemap/sourcemap v2.1.3+incompatible @@ -59,13 +58,21 @@ require ( ) require ( - github.com/DataDog/zstd v1.4.4 // indirect + github.com/DataDog/zstd v1.4.5 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect github.com/OneOfOne/xxhash v1.2.8 // indirect github.com/Shopify/sarama v1.38.1 // indirect github.com/apache/thrift v0.18.1 // indirect github.com/armon/go-radix v1.0.0 // indirect + github.com/axiomhq/hyperloglog v0.0.0-20230201085229-3ddf4bad03dc // indirect + github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect + github.com/cockroachdb/errors v1.8.1 // indirect + github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f // indirect + github.com/cockroachdb/pebble v0.0.0-20230627193317-c807f60529a3 // indirect + github.com/cockroachdb/redact v1.0.8 // indirect + github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 // indirect + github.com/cockroachdb/tokenbucket v0.0.0-20230613231145-182959a1fad6 // indirect github.com/containerd/containerd v1.7.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect @@ -106,10 +113,13 @@ require ( github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.16.7 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/kr/text v0.2.0 // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/magefile/mage v1.15.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.17 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/hashstructure v1.1.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.81.0 // indirect @@ -119,8 +129,12 @@ require ( github.com/pierrec/lz4/v4 v4.1.17 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/prometheus/client_golang v1.16.0 // indirect + github.com/prometheus/client_model v0.4.0 // indirect + github.com/prometheus/common v0.44.0 // indirect github.com/prometheus/procfs v0.10.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect + github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/shirou/gopsutil/v3 v3.23.5 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect @@ -141,7 +155,8 @@ require ( go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.11.0 // indirect - golang.org/x/mod v0.10.0 // indirect + golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 // indirect + golang.org/x/mod v0.11.0 // indirect golang.org/x/sys v0.10.0 // indirect golang.org/x/text v0.11.0 // indirect golang.org/x/tools v0.9.3 // indirect diff --git a/go.sum b/go.sum index c4412a75bce..19db9eedaca 100644 --- a/go.sum +++ b/go.sum @@ -31,19 +31,26 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/CloudyKit/fastprinter v0.0.0-20170127035650-74b38d55f37a/go.mod h1:EFZQ978U7x8IRnstaskI3IysnWY5Ao3QgZUKOXlsAdw= +github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible/go.mod h1:HPYO+50pSWkPoj9Q/eq0aRGByCL6ScRlUmiEX5Zgm+w= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= -github.com/DataDog/zstd v1.4.4 h1:+IawcoXhCBylN7ccwdwf8LOH2jKq7NavGpEPanrlTzE= -github.com/DataDog/zstd v1.4.4/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= +github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= +github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= +github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7/go.mod h1:6E6s8o2AE4KhCrqr6GRJjdC/gNfTdxkIXvuGZZda2VM= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/andrewkroh/goja v0.0.0-20190128172624-dd2ac4456e20 h1:7rj9qZ63knnVo2ZeepYHvHuRdG76f3tRUTdIQDzRBeI= github.com/andrewkroh/goja v0.0.0-20190128172624-dd2ac4456e20/go.mod h1:cI59GRkC2FRaFYtgbYEqMlgnnfvAwXzjojyZKXwklNg= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= @@ -66,8 +73,11 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.16.8 h1:GLGfpqX+1bmjNvUJkwB1ZaDpNFXQ github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= github.com/axiomhq/hyperloglog v0.0.0-20230201085229-3ddf4bad03dc h1:Keo7wQ7UODUaHcEi7ltENhbAK2VgZjfat6mLy03tQzo= github.com/axiomhq/hyperloglog v0.0.0-20230201085229-3ddf4bad03dc/go.mod h1:k08r+Yj1PRAmuayFiRK6MYuR5Ve4IuZtTfxErMIh0+c= +github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -81,6 +91,22 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/datadriven v1.0.0/go.mod h1:5Ib8Meh+jk1RlHIXej6Pzevx/NLlNvQB9pmSBZErGA4= +github.com/cockroachdb/datadriven v1.0.3-0.20230413201302-be42291fc80f h1:otljaYPt5hWxV3MUfO5dFPFiOXg9CyG5/kCfayTqsJ4= +github.com/cockroachdb/errors v1.6.1/go.mod h1:tm6FTP5G81vwJ5lC0SizQo374JNCOPrHyXGitRJoDqM= +github.com/cockroachdb/errors v1.8.1 h1:A5+txlVZfOqFBDa4mGz2bUWSp0aHElvHX2bKkdbQu+Y= +github.com/cockroachdb/errors v1.8.1/go.mod h1:qGwQn6JmZ+oMjuLwjWzUNqblqk0xl4CVV3SQbGwK7Ac= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/cockroachdb/pebble v0.0.0-20230627193317-c807f60529a3 h1:CXm5oPjaeoUYSH+sfPrCHreOCSfdsmC6+XhwCkWJ+2A= +github.com/cockroachdb/pebble v0.0.0-20230627193317-c807f60529a3/go.mod h1:FN5O47SBEz5+kO9fG8UTR64g2WS1u5ZFCgTvxGjoSks= +github.com/cockroachdb/redact v1.0.8 h1:8QG/764wK+vmEYoOlfobpe12EQcS81ukx/a4hdVMxNw= +github.com/cockroachdb/redact v1.0.8/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2 h1:IKgmqgMQlVJIZj19CdocBeSfSaiCbEBZGKODaixqtHM= +github.com/cockroachdb/sentry-go v0.6.1-cockroachdb.2/go.mod h1:8BT+cPK6xvFOcRlk0R8eg+OTkcqI6baNH4xAkpiYVvQ= +github.com/cockroachdb/tokenbucket v0.0.0-20230613231145-182959a1fad6 h1:DJK8W/iB+s/qkTtmXSrHA49lp5O3OsR7E6z4byOLy34= +github.com/cockroachdb/tokenbucket v0.0.0-20230613231145-182959a1fad6/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/containerd/containerd v1.7.1 h1:k8DbDkSOwt5rgxQ3uCI4WMKIJxIndSCBUaGm5oRn+Go= github.com/containerd/containerd v1.7.1/go.mod h1:gA+nJUADRBm98QS5j5RPROnt0POQSMK+r7P7EGMC/Qc= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -92,11 +118,13 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgraph-io/badger/v2 v2.2007.3-0.20201012072640-f5a7e0a1c83b h1:mUDs72Rlzv6A4YN8w3Ra3hU9x/plOQPcQjZYL/1f5SM= github.com/dgraph-io/badger/v2 v2.2007.3-0.20201012072640-f5a7e0a1c83b/go.mod h1:26P/7fbL4kUZVEVKLAKXkBXKOydDmM2p1e+NhhnBCAE= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= @@ -121,6 +149,9 @@ github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6 h1:8yY/I9 github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/elastic/apm-aggregation v0.0.0-20230807142825-c82b2b7e590c h1:VKmJ07OWzS+mKx1ahY3XNUz/0iaixjQZGds64qrlUGY= +github.com/elastic/apm-aggregation v0.0.0-20230807142825-c82b2b7e590c/go.mod h1:TwDJCDT04Ni8WrSrD4oEBATnDa18dteY//jhL4kqGio= github.com/elastic/apm-data v0.1.1-0.20230803060036-9180b59d7888 h1:R2HpM1KxROvzvMHq/3XmuT/Y6oTcTteUFMJtQCP04GM= github.com/elastic/apm-data v0.1.1-0.20230803060036-9180b59d7888/go.mod h1:lMTMoCWNadiDJih/tLechuMTtumEeedtKJlBOYAv030= github.com/elastic/beats/v7 v7.0.0-alpha2.0.20230808073125-1fe462c68f7d h1:bZA2xJV6WQOQvu8C5P7BNsy/rQRbhoUiXtSS4wu37rk= @@ -143,8 +174,6 @@ github.com/elastic/go-docappender v0.2.1-0.20230724080315-b714d6181871 h1:8MRHKw github.com/elastic/go-docappender v0.2.1-0.20230724080315-b714d6181871/go.mod h1:yqBlaclEXBY6DCP3d28bf/HjJJcXhd2CCIy0kDuLNjQ= github.com/elastic/go-elasticsearch/v8 v8.9.0 h1:8xtmYjUkqtahl50E0Bg/wjKI7K63krJrrLipbNj/fCU= github.com/elastic/go-elasticsearch/v8 v8.9.0/go.mod h1:NGmpvohKiRHXI0Sw4fuUGn6hYOmAXlyCphKpzVBiqDE= -github.com/elastic/go-hdrhistogram v0.1.0 h1:7UVeQ9MsO5c9h8RJeH2S2lXCGi9hQB/94W6Pjjqprc4= -github.com/elastic/go-hdrhistogram v0.1.0/go.mod h1:NEl0wZTQXzwq7X2WBZGl5G3efcKbvv+r9mTZpXrIs78= github.com/elastic/go-licenser v0.3.1/go.mod h1:D8eNQk70FOCVBl3smCGQt/lv7meBeQno2eI1S5apiHQ= github.com/elastic/go-licenser v0.4.0/go.mod h1:V56wHMpmdURfibNBggaSBfqgPxyT1Tldns1i87iTEvU= github.com/elastic/go-licenser v0.4.1 h1:1xDURsc8pL5zYT9R29425J3vkHdt4RT5TNEMeRN48x4= @@ -172,15 +201,26 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= +github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -189,6 +229,7 @@ github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= @@ -196,14 +237,21 @@ github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZ github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g= github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= +github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= +github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -235,6 +283,7 @@ github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws= github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -252,6 +301,7 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -268,12 +318,14 @@ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm4 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= @@ -287,16 +339,24 @@ github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9 github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/hydrogen18/memlistener v0.0.0-20141126152155-54553eb933fb/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.15 h1:M8XP7IuFNsqUx6VPK2P9OSmsYsI/YFaGil0uD21V3dM= +github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= +github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= +github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0/go.mod h1:pMCz62A0xJL6I+umB2YTlFRwWXaDFA0jy+5HzGiJjqI= +github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jaegertracing/jaeger v1.47.0 h1:XXxTMO+GxX930gxKWsg90rFr6RswkCRIW0AgWFnTYsg= github.com/jaegertracing/jaeger v1.47.0/go.mod h1:mHU/OHFML51CijQql4+rLfgPOcIb9MhxOMn+RKQwrJc= github.com/jcchavezs/porto v0.1.0/go.mod h1:fESH0gzDHiutHRdX2hv27ojnOVFco37hg1W6E9EZF4A= @@ -319,23 +379,40 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= +github.com/juju/loggo v0.0.0-20180524022052-584905176618/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= +github.com/juju/testing v0.0.0-20180920084828-472a3e8b2073/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= +github.com/kataras/golog v0.0.9/go.mod h1:12HJgwBIZFNGL0EJnMRhmvGA0PQGx8VFwrZtM4CqbAk= +github.com/kataras/iris/v12 v12.0.1/go.mod h1:udK4vLQKkdDqMGJJVd/msuMtN6hpYJhg/lSzuxjhO+U= +github.com/kataras/neffos v0.0.10/go.mod h1:ZYmJC07hQPW67eKuzlfY7SO3bC0mw83A3j6im82hfqw= +github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d/go.mod h1:NV88laa9UiiDuX9AhMbDPkGYSPugBOV6yTZB1l2K9Z0= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/compress v1.9.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/libp2p/go-reuseport v0.0.2 h1:XSG94b1FJfGA01BUrT82imejHQyTxO4jEWqheyCXYvU= github.com/libp2p/go-reuseport v0.0.2/go.mod h1:SPD+5RwGC7rcnzngoYC86GjPzjSywuQyMVAheVBD9nQ= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= @@ -345,11 +422,21 @@ github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mediocregopher/mediocre-go-lib v0.0.0-20181029021733-cb65787f37ed/go.mod h1:dSsfyI2zABAdhcbvkXqgxOxrCsbYeHCPgrZkku60dSg= +github.com/mediocregopher/radix/v3 v3.3.0/go.mod h1:EmfVyvspXz1uZEyPBMyGK+kjWiKQGvsUt6O3Pj+LDCQ= +github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/hashstructure v1.1.0 h1:P6P1hdjqAAknpY/M1CGipelZgp+4y9ja9kmUZPXP+H0= github.com/mitchellh/hashstructure v1.1.0/go.mod h1:xUDAozZz0Wmdiufv0uyhnHkUTN6/6d8ulp4AwfLKrmA= @@ -357,10 +444,21 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/nats-io/nats.go v1.8.1/go.mod h1:BrFz9vVn0fU3AcH9Vn4Kd7W0NpJ651tD5omQ3M8LwxM= +github.com/nats-io/nkeys v0.0.2/go.mod h1:dab7URMsZm6Z/jp9Z5UGa87Uutgc2mVpXLC4B7TDb/4= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.81.0 h1:sPjCHuqjn5UYDJOai4FulMCfLP+7AbspjHfv0jAtmD0= github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.81.0/go.mod h1:moQ6krtZ8dyziij2P+9eao5+gBfCJjiNDwN7n2MZZs4= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.81.0 h1:UCF4zWe24m1+yQeYGEQjzq5c9yNAf4d1lknbR7PAoH4= @@ -378,6 +476,9 @@ github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9F github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4/v4 v4.1.17 h1:kV4Ip+/hUBC+8T6+2EgburRtkE9ef4nbY3f4dFhGjMc= github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -387,7 +488,13 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= @@ -397,12 +504,17 @@ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqn github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/santhosh-tekuri/jsonschema v1.2.4/go.mod h1:TEAUOeZSmIxTTuHatJzrvARHiuO9LYd+cIxzgEHCQI4= +github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/gopsutil/v3 v3.23.5 h1:5SgDCeQ0KW0S4N0znjeM/eFHXXOKyv2dVNgRq/c9P6Y= @@ -411,7 +523,10 @@ github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFt github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -448,17 +563,30 @@ github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaO github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/xdg/scram v1.0.3/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/scram v1.0.5 h1:TuS0RFmt5Is5qm9Tm2SoD89OPqe4IRiFtyFY4iwWXsw= github.com/xdg/scram v1.0.5/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v1.0.3 h1:cmL5Enob4W83ti/ZHuZLuKD/xqJfus4fVPwE+/BDm+4= github.com/xdg/stringprep v1.0.3/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= +github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= +github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -528,6 +656,7 @@ golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -545,6 +674,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw= +golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -568,13 +699,16 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -582,6 +716,7 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -592,6 +727,7 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -612,7 +748,7 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= +golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -628,8 +764,10 @@ golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -640,9 +778,12 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -656,6 +797,7 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -698,11 +840,15 @@ golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -773,6 +919,7 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -805,6 +952,7 @@ google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc h1:XSJ8Vk1SWuNr8S18z1NZSziL0CPIXLCCMDOEFtHBOFc= google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -846,6 +994,9 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/hjson/hjson-go.v3 v3.0.1/go.mod h1:X6zrTSVeImfwfZLfgQdInl9mWjqPqgH90jom9nym/lw= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/jcmturner/aescts.v1 v1.0.1 h1:cVVZBK2b1zY26haWB4vbBiZrfFQnfbTVrE3xZq6hrEw= @@ -858,11 +1009,15 @@ gopkg.in/jcmturner/gokrb5.v7 v7.5.0 h1:a9tsXlIDD9SKxotJMK3niV7rPZAJeX2aD/0yg3qlI gopkg.in/jcmturner/gokrb5.v7 v7.5.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= gopkg.in/jcmturner/rpc.v1 v1.1.0 h1:QHIUxTX1ISuAv9dD2wJ9HWQVuWDX/Zc0PfeC2tjc4rU= gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/beater/beater.go b/internal/beater/beater.go index 1f71b8840c7..8ac7b30b29a 100644 --- a/internal/beater/beater.go +++ b/internal/beater/beater.go @@ -225,21 +225,24 @@ func (s *Runner) Run(ctx context.Context) error { s.config.MaxConcurrentDecoders, memLimitGB, ) } - if s.config.Aggregation.Transactions.MaxTransactionGroups <= 0 { - s.config.Aggregation.Transactions.MaxTransactionGroups = maxTxGroupsForAggregation(memLimitGB) - s.logger.Infof("Transactions.MaxTransactionGroups set to %d based on %0.1fgb of memory", - s.config.Aggregation.Transactions.MaxTransactionGroups, memLimitGB, + + if s.config.Aggregation.MaxServices <= 0 { + s.config.Aggregation.MaxServices = maxGroupsForAggregation(memLimitGB) + s.logger.Infof("Aggregation.MaxServices set to %d based on %0.1fgb of memory", + s.config.Aggregation.MaxServices, memLimitGB, ) } - if s.config.Aggregation.Transactions.MaxServices <= 0 { - s.config.Aggregation.Transactions.MaxServices = maxGroupsForAggregation(memLimitGB) - s.logger.Infof("Transactions.MaxServices set to %d based on %0.1fgb of memory", - s.config.Aggregation.Transactions.MaxServices, memLimitGB, + + if s.config.Aggregation.Transactions.MaxGroups <= 0 { + s.config.Aggregation.Transactions.MaxGroups = maxTxGroupsForAggregation(memLimitGB) + s.logger.Infof("Aggregation.Transactions.MaxGroups set to %d based on %0.1fgb of memory", + s.config.Aggregation.Transactions.MaxGroups, memLimitGB, ) } + if s.config.Aggregation.ServiceTransactions.MaxGroups <= 0 { s.config.Aggregation.ServiceTransactions.MaxGroups = maxGroupsForAggregation(memLimitGB) - s.logger.Infof("ServiceTransactions.MaxGroups for service aggregation set to %d based on %0.1fgb of memory", + s.logger.Infof("Aggregation.ServiceTransactions.MaxGroups for service aggregation set to %d based on %0.1fgb of memory", s.config.Aggregation.ServiceTransactions.MaxGroups, memLimitGB, ) } @@ -296,18 +299,18 @@ func (s *Runner) Run(ctx context.Context) error { } defer tracer.Close() - provider, err := apmotel.NewTracerProvider(apmotel.WithAPMTracer(tracer)) + tracerProvider, err := apmotel.NewTracerProvider(apmotel.WithAPMTracer(tracer)) if err != nil { return err } - otel.SetTracerProvider(provider) + otel.SetTracerProvider(tracerProvider) exporter, err := apmotel.NewGatherer() if err != nil { return err } - mp := metric.NewMeterProvider(metric.WithReader(exporter)) - otel.SetMeterProvider(mp) + meterProvider := metric.NewMeterProvider(metric.WithReader(exporter)) + otel.SetMeterProvider(meterProvider) tracer.RegisterMetricsGatherer(exporter) // Ensure the libbeat output and go-elasticsearch clients do not index diff --git a/internal/beater/config/aggregation.go b/internal/beater/config/aggregation.go index 9ca7b4252e1..3163d30ba1e 100644 --- a/internal/beater/config/aggregation.go +++ b/internal/beater/config/aggregation.go @@ -18,15 +18,12 @@ package config const ( - defaultTransactionAggregationHDRHistogramSignificantFigures = 2 - defaultServiceDestinationAggregationMaxGroups = 10000 - - defaultServiceTxAggregationHDRHistogramSignificantFigures = 2 ) // AggregationConfig holds configuration related to various metrics aggregations. type AggregationConfig struct { + MaxServices int `config:"max_services"` // if <= 0 then will be set based on memory limits Transactions TransactionAggregationConfig `config:"transactions"` ServiceDestinations ServiceDestinationAggregationConfig `config:"service_destinations"` ServiceTransactions ServiceTransactionAggregationConfig `config:"service_transactions"` @@ -34,9 +31,7 @@ type AggregationConfig struct { // TransactionAggregationConfig holds configuration related to transaction metrics aggregation. type TransactionAggregationConfig struct { - MaxTransactionGroups int `config:"max_groups"` // if <= 0 then will be set based on memory limits - MaxServices int `config:"max_services"` // if <= 0 then will be set based on memory limits - HDRHistogramSignificantFigures int `config:"hdrhistogram_significant_figures" validate:"min=1, max=5"` + MaxGroups int `config:"max_groups"` // if <= 0 then will be set based on memory limits } // ServiceDestinationAggregationConfig holds configuration related to span metrics aggregation for service maps. @@ -46,20 +41,13 @@ type ServiceDestinationAggregationConfig struct { // ServiceTransactionAggregationConfig holds configuration related to service transaction metrics aggregation. type ServiceTransactionAggregationConfig struct { - MaxGroups int `config:"max_groups"` // if <= 0 then will be set based on memory limits - HDRHistogramSignificantFigures int `config:"hdrhistogram_significant_figures" validate:"min=1, max=5"` + MaxGroups int `config:"max_groups"` // if <= 0 then will be set based on memory limits } func defaultAggregationConfig() AggregationConfig { return AggregationConfig{ - Transactions: TransactionAggregationConfig{ - HDRHistogramSignificantFigures: defaultTransactionAggregationHDRHistogramSignificantFigures, - }, ServiceDestinations: ServiceDestinationAggregationConfig{ MaxGroups: defaultServiceDestinationAggregationMaxGroups, }, - ServiceTransactions: ServiceTransactionAggregationConfig{ - HDRHistogramSignificantFigures: defaultServiceTxAggregationHDRHistogramSignificantFigures, - }, } } diff --git a/internal/beater/config/aggregation_test.go b/internal/beater/config/aggregation_test.go index 8ded93fe654..f4ab5f212ec 100644 --- a/internal/beater/config/aggregation_test.go +++ b/internal/beater/config/aggregation_test.go @@ -26,36 +26,6 @@ import ( "github.com/elastic/elastic-agent-libs/config" ) -func TestAggregationConfigInvalid(t *testing.T) { - type test struct { - name string - - key string - value interface{} - expect string - } - - for _, test := range []test{{ - name: "non-positive hdrhistogram_significant_figures", - key: "aggregation.transactions.hdrhistogram_significant_figures", - value: float64(0), - expect: "Error processing configuration: requires value >= 1 accessing 'aggregation.transactions.hdrhistogram_significant_figures'", - }, { - name: "hdrhistogram_significant_figures too high", - key: "aggregation.transactions.hdrhistogram_significant_figures", - value: float64(6), - expect: "Error processing configuration: requires value <= 5 accessing 'aggregation.transactions.hdrhistogram_significant_figures'", - }} { - t.Run(test.name, func(t *testing.T) { - _, err := NewConfig(config.MustNewConfigFrom(map[string]interface{}{ - test.key: test.value, - }), nil) - require.Error(t, err) - assert.EqualError(t, err, test.expect) - }) - } -} - func TestAggregationConfigDefault(t *testing.T) { cfg, err := NewConfig(config.MustNewConfigFrom(map[string]interface{}{}), nil) require.NoError(t, err) diff --git a/internal/beater/config/config_test.go b/internal/beater/config/config_test.go index 0253c36f20c..d564fed1816 100644 --- a/internal/beater/config/config_test.go +++ b/internal/beater/config/config_test.go @@ -234,10 +234,10 @@ func TestUnpackConfig(t *testing.T) { "api_key": "id:api_key", }, "aggregation": map[string]interface{}{ + "max_services": 111, "transactions": map[string]interface{}{ - "rollup_intervals": []string{"10s", "10m"}, - "max_groups": 123, - "hdrhistogram_significant_figures": 1, + "rollup_intervals": []string{"10s", "10m"}, + "max_groups": 123, }, "service_destinations": map[string]interface{}{ "max_groups": 456, @@ -336,16 +336,15 @@ func TestUnpackConfig(t *testing.T) { ESOverrideConfigured: true, }, Aggregation: AggregationConfig{ + MaxServices: 111, Transactions: TransactionAggregationConfig{ - MaxTransactionGroups: 123, - HDRHistogramSignificantFigures: 1, + MaxGroups: 123, }, ServiceDestinations: ServiceDestinationAggregationConfig{ MaxGroups: 456, }, ServiceTransactions: ServiceTransactionAggregationConfig{ - MaxGroups: 457, - HDRHistogramSignificantFigures: 2, + MaxGroups: 457, }, }, Sampling: SamplingConfig{ @@ -471,16 +470,15 @@ func TestUnpackConfig(t *testing.T) { Cache: Cache{Expiration: 30 * time.Second}, }, Aggregation: AggregationConfig{ + MaxServices: 0, // Default value is set as per memory limit Transactions: TransactionAggregationConfig{ - MaxTransactionGroups: 0, // Default value is set as per memory limit - HDRHistogramSignificantFigures: 2, + MaxGroups: 0, // Default value is set as per memory limit }, ServiceDestinations: ServiceDestinationAggregationConfig{ MaxGroups: 10000, }, ServiceTransactions: ServiceTransactionAggregationConfig{ - MaxGroups: 0, // Default value is set as per memory limit - HDRHistogramSignificantFigures: 2, + MaxGroups: 0, // Default value is set as per memory limit }, }, Sampling: SamplingConfig{ diff --git a/systemtest/aggregation_test.go b/systemtest/aggregation_test.go index 2debf7f3293..53e50f88f8c 100644 --- a/systemtest/aggregation_test.go +++ b/systemtest/aggregation_test.go @@ -27,7 +27,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/tidwall/gjson" "go.elastic.co/apm/v2" "github.com/elastic/apm-server/systemtest" @@ -41,11 +40,6 @@ import ( func TestTransactionAggregation(t *testing.T) { systemtest.CleanupElasticsearch(t) srv := apmservertest.NewUnstartedServerTB(t) - srv.Config.Monitoring = &apmservertest.MonitoringConfig{ - Enabled: true, - MetricsPeriod: 100 * time.Millisecond, - StatePeriod: 100 * time.Millisecond, - } require.NoError(t, srv.Start()) // Send some transactions to the server to be aggregated. @@ -77,10 +71,6 @@ func TestTransactionAggregation(t *testing.T) { espoll.TermQuery{Field: "processor.event", Value: "transaction"}, ) - // Make sure apm-server.aggregation.txmetrics metrics are published. Metric values are unit tested. - doc := getBeatsMonitoringStats(t, srv, nil) - assert.True(t, gjson.GetBytes(doc.RawSource, "beats_stats.metrics.apm-server.aggregation.txmetrics").Exists()) - // Stop server to ensure metrics are flushed on shutdown. assert.NoError(t, srv.Close()) @@ -314,7 +304,6 @@ func TestServiceTransactionMetricsAggregationLabels(t *testing.T) { // TestServiceTransactionMetricsAggregationLabelsRUM checks that RUM labels are ignored for aggregation func TestServiceTransactionMetricsAggregationLabelsRUM(t *testing.T) { - t.Setenv("ELASTIC_APM_GLOBAL_LABELS", "department_name=apm,organization=observability,company=elastic") systemtest.CleanupElasticsearch(t) srv := apmservertest.NewUnstartedServerTB(t) srv.Config.RUM = &apmservertest.RUMConfig{ @@ -389,7 +378,7 @@ func TestServiceSummaryMetricsAggregationOverflow(t *testing.T) { systemtest.CleanupElasticsearch(t) srv := apmservertest.NewUnstartedServerTB(t) srv.Config.Aggregation = &apmservertest.AggregationConfig{ - ServiceTransactionMaxGroups: 2, + MaxServices: 2, } require.NoError(t, srv.Start()) diff --git a/systemtest/apmservertest/config.go b/systemtest/apmservertest/config.go index 83503cbf004..b014d9a0989 100644 --- a/systemtest/apmservertest/config.go +++ b/systemtest/apmservertest/config.go @@ -310,7 +310,7 @@ func durationString(d time.Duration) string { // AggregationConfig holds configuration related to aggregation. type AggregationConfig struct { - ServiceTransactionMaxGroups int `json:"service_transactions.max_groups,omitempty"` + MaxServices int `json:"max_services,omitempty"` } func configArgs(cfg Config, extra map[string]interface{}) ([]string, error) { diff --git a/systemtest/approvals/TestServiceDestinationAggregation.approved.json b/systemtest/approvals/TestServiceDestinationAggregation.approved.json index 145984d7393..3a5b054aaed 100644 --- a/systemtest/approvals/TestServiceDestinationAggregation.approved.json +++ b/systemtest/approvals/TestServiceDestinationAggregation.approved.json @@ -38,6 +38,9 @@ "name": "metric" }, "service": { + "language": { + "name": "go" + }, "name": "systemtest", "target": { "type": "resource" @@ -96,6 +99,9 @@ "name": "metric" }, "service": { + "language": { + "name": "go" + }, "name": "systemtest", "target": { "type": "resource" @@ -154,6 +160,9 @@ "name": "metric" }, "service": { + "language": { + "name": "go" + }, "name": "systemtest", "target": { "type": "resource" diff --git a/systemtest/approvals/TestServiceSummaryMetricsAggregationOverflow.approved.json b/systemtest/approvals/TestServiceSummaryMetricsAggregationOverflow.approved.json index 870d9ec9819..40d64987c8a 100644 --- a/systemtest/approvals/TestServiceSummaryMetricsAggregationOverflow.approved.json +++ b/systemtest/approvals/TestServiceSummaryMetricsAggregationOverflow.approved.json @@ -139,7 +139,7 @@ "name": "metric" }, "service": { - "environment": "dev", + "environment": "prod", "language": { "name": "go" }, @@ -177,7 +177,7 @@ "name": "metric" }, "service": { - "environment": "dev", + "environment": "prod", "language": { "name": "go" }, @@ -215,7 +215,7 @@ "name": "metric" }, "service": { - "environment": "dev", + "environment": "prod", "language": { "name": "go" }, @@ -253,7 +253,7 @@ "name": "metric" }, "service": { - "environment": "staging", + "environment": "test", "language": { "name": "go" }, @@ -291,7 +291,7 @@ "name": "metric" }, "service": { - "environment": "staging", + "environment": "test", "language": { "name": "go" }, @@ -329,7 +329,7 @@ "name": "metric" }, "service": { - "environment": "staging", + "environment": "test", "language": { "name": "go" }, diff --git a/systemtest/approvals/TestTransactionDroppedSpansStatsMetrics.approved.json b/systemtest/approvals/TestTransactionDroppedSpansStatsMetrics.approved.json index a1d0d1b3796..1bf6c4dc6c4 100644 --- a/systemtest/approvals/TestTransactionDroppedSpansStatsMetrics.approved.json +++ b/systemtest/approvals/TestTransactionDroppedSpansStatsMetrics.approved.json @@ -33,6 +33,9 @@ "name": "metric" }, "service": { + "language": { + "name": "go" + }, "name": "systemtest", "target": { "type": "elasticsearch" @@ -85,6 +88,9 @@ "name": "metric" }, "service": { + "language": { + "name": "go" + }, "name": "systemtest", "target": { "type": "elasticsearch" @@ -137,6 +143,9 @@ "name": "metric" }, "service": { + "language": { + "name": "go" + }, "name": "systemtest", "target": { "type": "elasticsearch" @@ -189,6 +198,9 @@ "name": "metric" }, "service": { + "language": { + "name": "go" + }, "name": "systemtest", "target": { "type": "redis" @@ -241,6 +253,9 @@ "name": "metric" }, "service": { + "language": { + "name": "go" + }, "name": "systemtest", "target": { "type": "redis" @@ -293,6 +308,9 @@ "name": "metric" }, "service": { + "language": { + "name": "go" + }, "name": "systemtest", "target": { "type": "redis" diff --git a/tools/notice/overrides.json b/tools/notice/overrides.json index 71ee4d8a537..9f854434036 100644 --- a/tools/notice/overrides.json +++ b/tools/notice/overrides.json @@ -1,5 +1,6 @@ {"name": "github.com/elastic/beats/v7", "licenceType": "Elastic"} {"name": "github.com/elastic/elastic-agent-client/v7", "licenceType": "Elastic"} -{"name": "github.com/elastic/elastic-agent-shipper-client", "licenceType": "Elastic"} +{"name": "github.com/elastic/elastic-agent-shipper-client", "licenceType": "Elastic-2.0"} {"name": "github.com/golang/glog", "licenceType": "Apache-2.0"} {"name": "github.com/miekg/dns", "licenceType": "BSD"} +{"name": "github.com/elastic/apm-aggregation", "licenceType": "Elastic-2.0"} diff --git a/tools/notice/rules.json b/tools/notice/rules.json index c9638a9c6cf..5a351dbcbb8 100644 --- a/tools/notice/rules.json +++ b/tools/notice/rules.json @@ -6,6 +6,7 @@ "BSD-2-Clause-FreeBSD", "BSD-3-Clause", "Elastic", + "Elastic-2.0", "ISC", "MIT", "MPL-2.0", diff --git a/x-pack/apm-server/aggregation/baseaggregator/aggregator.go b/x-pack/apm-server/aggregation/baseaggregator/aggregator.go deleted file mode 100644 index f8dba56f209..00000000000 --- a/x-pack/apm-server/aggregation/baseaggregator/aggregator.go +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one -// or more contributor license agreements. Licensed under the Elastic License 2.0; -// you may not use this file except in compliance with the Elastic License 2.0. - -package baseaggregator - -import ( - "context" - "sync" - "time" - - "github.com/pkg/errors" - - "github.com/elastic/elastic-agent-libs/logp" -) - -// PublishFunc encapsulates the metric publishing function -type PublishFunc func(context.Context, time.Duration) error - -// AggregatorConfig defined the common aggregator configuration. -type AggregatorConfig struct { - // PublishFunc is the function that performs the actual publishing - // of aggregated events. - PublishFunc PublishFunc - - // Logger is the logger for logging metrics aggregation/publishing. - // - // If Logger is nil, a new logger will be constructed. - Logger *logp.Logger - - // RollUpIntervals are additional MetricsInterval for the aggregator to - // compute and publish metrics for. Each additional interval is constrained - // to the same rules as MetricsInterval, and will result in additional - // memory to be allocated. - RollUpIntervals []time.Duration - - // Interval is the interval between publishing of aggregated metrics. - // There may be additional metrics reported at arbitrary times if the - // aggregation groups fill up. - Interval time.Duration -} - -// Validate validates the aggregator config. -func (cfg AggregatorConfig) Validate() error { - if cfg.PublishFunc == nil { - return errors.New("PublishFunc unspecified") - } - if cfg.Interval <= 0 { - return errors.New("Interval unspecified or negative") - } - if cfg.Logger == nil { - return errors.New("Logger unspecified") - } - for i, interval := range cfg.RollUpIntervals { - if interval <= 0 { - return errors.Errorf("RollUpIntervals[%d]: unspecified or negative", i) - } - if interval%cfg.Interval != 0 { - return errors.Errorf("RollUpIntervals[%d]: interval must be a multiple of MetricsInterval", i) - } - } - return nil -} - -// Aggregator contains the basic methods for the metrics aggregators to embed. -type Aggregator struct { - stopMu sync.Mutex - stopping chan struct{} - stopped chan struct{} - publish PublishFunc - Intervals []time.Duration - - config AggregatorConfig -} - -// New returns a new base Aggregator. -func New(cfg AggregatorConfig) (*Aggregator, error) { - if err := cfg.Validate(); err != nil { - return nil, errors.Wrap(err, "invalid aggregator config") - } - return &Aggregator{ - stopping: make(chan struct{}), - stopped: make(chan struct{}), - config: cfg, - publish: cfg.PublishFunc, - Intervals: append([]time.Duration{cfg.Interval}, cfg.RollUpIntervals...), - }, nil -} - -// Run runs the Aggregator, periodically publishing and clearing aggregated -// metrics. Run returns when either a fatal error occurs, or the Aggregator's -// Stop method is invoked. -func (a *Aggregator) Run() error { - ticker := time.NewTicker(a.config.Interval) - defer ticker.Stop() - defer func() { - a.stopMu.Lock() - defer a.stopMu.Unlock() - select { - case <-a.stopped: - default: - close(a.stopped) - } - }() - var stop bool - var ticks uint64 - for !stop { - select { - case <-a.stopping: - stop = true - case <-ticker.C: - ticks++ - } - // Publish the metricsets for all configured intervals. - for _, interval := range a.Intervals { - // Publish $interval MetricSets when: - // - ticks * MetricsInterval % $interval == 0. - // - Aggregator is stopped. - if !stop && (ticks*uint64(a.config.Interval))%uint64(interval) != 0 { - continue - } - if err := a.publish(context.Background(), interval); err != nil { - a.config.Logger.With(logp.Error(err)).Warnf( - "publishing of %s metrics failed: %s", - interval.String(), err, - ) - } - } - } - return nil -} - -// Stop stops the Aggregator if it is running, waiting for it to flush any -// aggregated metrics and return, or for the context to be cancelled. -// -// After Stop has been called the aggregator cannot be reused, as the Run -// method will always return immediately. -func (a *Aggregator) Stop(ctx context.Context) error { - a.stopMu.Lock() - select { - case <-a.stopped: - case <-a.stopping: - // Already stopping/stopped. - default: - close(a.stopping) - } - a.stopMu.Unlock() - - select { - case <-a.stopped: - case <-ctx.Done(): - return ctx.Err() - } - return nil -} diff --git a/x-pack/apm-server/aggregation/baseaggregator/space.go b/x-pack/apm-server/aggregation/baseaggregator/space.go deleted file mode 100644 index 83ffb82ce63..00000000000 --- a/x-pack/apm-server/aggregation/baseaggregator/space.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one -// or more contributor license agreements. Licensed under the Elastic License 2.0; -// you may not use this file except in compliance with the Elastic License 2.0. - -package baseaggregator - -import "github.com/pkg/errors" - -// Space models a backing array for aggregators to store their metrics. The backing -// array pre-allocates the required number of entries to reduce GC overhead. -// -// Requires protection using mutexes for concurrent usage by the caller. -// TODO: Update all aggregators to use Space. -type Space[k any] struct { - index int - space []k -} - -// NewSpace creates a new space given the max number of elements. -func NewSpace[k any](limit int) *Space[k] { - return &Space[k]{ - space: make([]k, limit), - } -} - -// Next returns the next entry from the space or error if no more entries can be -// returned. -func (s *Space[k]) Next() (*k, error) { - if s.index == len(s.space) { - return nil, errors.New("all entries are used") - } - e := &s.space[s.index] - s.index++ - return e, nil -} - -// Reset resets the space to be reused. Note that reset doesn't reset the fields -// for the struct and they must be updated or reset by the caller. -func (s *Space[k]) Reset() { - s.index = 0 -} diff --git a/x-pack/apm-server/aggregation/interval/string.go b/x-pack/apm-server/aggregation/interval/string.go deleted file mode 100644 index 64df2666de0..00000000000 --- a/x-pack/apm-server/aggregation/interval/string.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one -// or more contributor license agreements. Licensed under the Elastic License 2.0; -// you may not use this file except in compliance with the Elastic License 2.0. - -package interval - -import ( - "fmt" - "time" -) - -// FormatDuration formats the duration in minutes (when the duration >= 1m), or -// seconds if smaller. -func FormatDuration(d time.Duration) string { - if duration := d.Minutes(); duration >= 1 { - return fmt.Sprintf("%.0fm", duration) - } - return fmt.Sprintf("%.0fs", d.Seconds()) -} diff --git a/x-pack/apm-server/aggregation/labels/labels.go b/x-pack/apm-server/aggregation/labels/labels.go deleted file mode 100644 index a8bd1fcc89e..00000000000 --- a/x-pack/apm-server/aggregation/labels/labels.go +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one -// or more contributor license agreements. Licensed under the Elastic License 2.0; -// you may not use this file except in compliance with the Elastic License 2.0. - -package labels - -import ( - "encoding/binary" - "io" - "math" - "sort" - - "github.com/elastic/apm-data/model/modelpb" -) - -type AggregatedGlobalLabels struct { - labelKeys []string - Labels modelpb.Labels - numericLabelKeys []string - NumericLabels modelpb.NumericLabels -} - -func (a *AggregatedGlobalLabels) Write(w io.Writer) { - for _, key := range a.labelKeys { - label := a.Labels[key] - io.WriteString(w, key) - if label.Value != "" { - io.WriteString(w, label.Value) - continue - } - for _, v := range label.Values { - io.WriteString(w, v) - } - } - for _, key := range a.numericLabelKeys { - label := a.NumericLabels[key] - io.WriteString(w, key) - if label.Value != 0 { - var b [8]byte - binary.LittleEndian.PutUint64(b[:], math.Float64bits(label.Value)) - w.Write(b[:]) - continue - } - for _, v := range label.Values { - var b [8]byte - binary.LittleEndian.PutUint64(b[:], math.Float64bits(v)) - w.Write(b[:]) - } - } -} - -func (a *AggregatedGlobalLabels) Read(event *modelpb.APMEvent) { - // Remove global labels for RUM services to avoid explosion of metric groups - // to track for servicetxmetrics. - // For consistency, this will remove labels for other aggregated metrics as well. - switch event.GetAgent().GetName() { - case "rum-js", "js-base", "android/java", "iOS/swift": - return - } - - for k, v := range event.Labels { - if !v.Global { - continue - } - if a.Labels == nil { - a.Labels = make(modelpb.Labels) - } - if len(v.Values) > 0 { - a.Labels.SetSlice(k, v.Values) - } else { - a.Labels.Set(k, v.Value) - } - a.labelKeys = append(a.labelKeys, k) - } - for k, v := range event.NumericLabels { - if !v.Global { - continue - } - if a.NumericLabels == nil { - a.NumericLabels = make(modelpb.NumericLabels) - } - if len(v.Values) > 0 { - a.NumericLabels.SetSlice(k, v.Values) - } else { - a.NumericLabels.Set(k, v.Value) - } - a.numericLabelKeys = append(a.numericLabelKeys, k) - } - sort.Strings(a.labelKeys) - sort.Strings(a.numericLabelKeys) -} - -func (a *AggregatedGlobalLabels) Equals(x *AggregatedGlobalLabels) bool { - return equalLabels(a.Labels, x.Labels) && equalNumericLabels(a.NumericLabels, x.NumericLabels) -} - -// equalLabels returns true if the labels are equal. The Global property is -// ignored since only global labels are compared. -func equalLabels(l, labels modelpb.Labels) bool { - if len(l) != len(labels) { - return false - } - for key, localV := range l { - v, ok := labels[key] - if !ok { - return false - } - // If the slice value is set, ignore the Value field. - if len(v.Values) == 0 && v.Value != localV.Value { - return false - } - if len(v.Values) != len(localV.Values) { - return false - } - for i, value := range v.Values { - if localV.Values[i] != value { - return false - } - } - } - return true -} - -// equalNumericLabels returns true if the labels are equal. The Global property -// is ignored since only global labels are compared. -func equalNumericLabels(l, labels modelpb.NumericLabels) bool { - if len(l) != len(labels) { - return false - } - for key, localV := range l { - v, ok := labels[key] - if !ok { - return false - } - // If the slice value is set, ignore the Value field. - if len(v.Values) == 0 && v.Value != localV.Value { - return false - } - if len(v.Values) != len(localV.Values) { - return false - } - for i, value := range v.Values { - if localV.Values[i] != value { - return false - } - } - } - return true -} diff --git a/x-pack/apm-server/aggregation/labels/labels_test.go b/x-pack/apm-server/aggregation/labels/labels_test.go deleted file mode 100644 index f536dedd316..00000000000 --- a/x-pack/apm-server/aggregation/labels/labels_test.go +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one -// or more contributor license agreements. Licensed under the Elastic License 2.0; -// you may not use this file except in compliance with the Elastic License 2.0. - -package labels - -import ( - "testing" - - "github.com/stretchr/testify/assert" - - "github.com/elastic/apm-data/model/modelpb" -) - -func TestLabelsEqual(t *testing.T) { - t.Run("true", func(t *testing.T) { - a := modelpb.Labels{ - "a": &modelpb.LabelValue{Value: "b"}, - "b": &modelpb.LabelValue{Values: []string{"b", "c", "d", "e"}}, - "c": &modelpb.LabelValue{Values: []string{"1", "2", "3"}}, - } - b := modelpb.Labels{ - "a": &modelpb.LabelValue{Value: "b"}, - "b": &modelpb.LabelValue{Values: []string{"b", "c", "d", "e"}}, - "c": &modelpb.LabelValue{Values: []string{"1", "2", "3"}, Value: "b"}, - } - assert.True(t, equalLabels(a, b)) - assert.True(t, equalLabels(b, a)) - }) - t.Run("false-length", func(t *testing.T) { - a := modelpb.Labels{ - "a": &modelpb.LabelValue{Value: "b"}, - "b": &modelpb.LabelValue{Values: []string{"b", "c", "d", "e"}}, - } - b := modelpb.Labels{ - "a": &modelpb.LabelValue{Value: "b"}, - "b": &modelpb.LabelValue{Values: []string{"b", "c", "d", "e"}}, - "c": &modelpb.LabelValue{Values: []string{"3", "2", "1"}, Value: "b"}, - } - assert.False(t, equalLabels(a, b)) - assert.False(t, equalLabels(b, a)) - }) - t.Run("false-elements-not-match", func(t *testing.T) { - a := modelpb.Labels{ - "a": &modelpb.LabelValue{Value: "b"}, - "b": &modelpb.LabelValue{Values: []string{"b", "c", "d", "e"}}, - "d": &modelpb.LabelValue{Value: "c"}, - } - b := modelpb.Labels{ - "a": &modelpb.LabelValue{Value: "b"}, - "b": &modelpb.LabelValue{Values: []string{"e", "c", "d", "b"}}, - "c": &modelpb.LabelValue{Values: []string{"3", "2", "1"}, Value: "b"}, - } - assert.False(t, equalLabels(a, b)) - assert.False(t, equalLabels(b, a)) - }) - t.Run("false-values-not-match", func(t *testing.T) { - a := modelpb.Labels{ - "a": &modelpb.LabelValue{Value: "c"}, - "b": &modelpb.LabelValue{Values: []string{"b", "c", "d", "e"}}, - "c": &modelpb.LabelValue{Values: []string{"3", "2", "1"}, Value: "b"}, - } - b := modelpb.Labels{ - "a": &modelpb.LabelValue{Value: "b"}, - "b": &modelpb.LabelValue{Values: []string{"b", "c", "d", "e"}}, - "c": &modelpb.LabelValue{Values: []string{"3", "2", "1"}, Value: "b"}, - } - assert.False(t, equalLabels(a, b)) - assert.False(t, equalLabels(b, a)) - }) - t.Run("false-slices-length-not-match", func(t *testing.T) { - a := modelpb.Labels{ - "a": &modelpb.LabelValue{Value: "b"}, - "b": &modelpb.LabelValue{Values: []string{"b", "c", "d"}}, - "c": &modelpb.LabelValue{Values: []string{"3", "2", "1"}, Value: "b"}, - } - b := modelpb.Labels{ - "a": &modelpb.LabelValue{Value: "b"}, - "b": &modelpb.LabelValue{Values: []string{"b", "c", "d", "e"}}, - "c": &modelpb.LabelValue{Values: []string{"3", "2", "1"}, Value: "b"}, - } - assert.False(t, equalLabels(a, b)) - assert.False(t, equalLabels(b, a)) - }) - t.Run("false-slices-elements-not-match", func(t *testing.T) { - a := modelpb.Labels{ - "a": &modelpb.LabelValue{Value: "b"}, - "b": &modelpb.LabelValue{Values: []string{"b", "c", "d", "a"}}, - "c": &modelpb.LabelValue{Values: []string{"3", "2", "1"}, Value: "b"}, - } - b := modelpb.Labels{ - "a": &modelpb.LabelValue{Value: "b"}, - "b": &modelpb.LabelValue{Values: []string{"e", "c", "d", "b"}}, - "c": &modelpb.LabelValue{Values: []string{"3", "2", "1"}, Value: "b"}, - } - assert.False(t, equalLabels(a, b)) - assert.False(t, equalLabels(b, a)) - }) -} - -func TestNumericLabelsEqual(t *testing.T) { - t.Run("true", func(t *testing.T) { - a := modelpb.NumericLabels{ - "a": &modelpb.NumericLabelValue{Value: 1}, - "b": &modelpb.NumericLabelValue{Values: []float64{1.1, 1.2, 1.3, 1.4}}, - "c": &modelpb.NumericLabelValue{Values: []float64{10, 20, 30}}, - } - b := modelpb.NumericLabels{ - "a": &modelpb.NumericLabelValue{Value: 1}, - "b": &modelpb.NumericLabelValue{Values: []float64{1.1, 1.2, 1.3, 1.4}}, - "c": &modelpb.NumericLabelValue{Values: []float64{10, 20, 30}, Value: 1}, - } - assert.True(t, equalNumericLabels(a, b)) - assert.True(t, equalNumericLabels(b, a)) - }) - t.Run("false-length", func(t *testing.T) { - a := modelpb.NumericLabels{ - "a": &modelpb.NumericLabelValue{Value: 1}, - "b": &modelpb.NumericLabelValue{Values: []float64{1.1, 1.2, 1.3, 1.4}}, - } - b := modelpb.NumericLabels{ - "a": &modelpb.NumericLabelValue{Value: 1}, - "b": &modelpb.NumericLabelValue{Values: []float64{1.1, 1.2, 1.3, 1.4}}, - "c": &modelpb.NumericLabelValue{Values: []float64{30, 20, 10}, Value: 1}, - } - assert.False(t, equalNumericLabels(a, b)) - assert.False(t, equalNumericLabels(b, a)) - }) - t.Run("false-elements-not-match", func(t *testing.T) { - a := modelpb.NumericLabels{ - "a": &modelpb.NumericLabelValue{Value: 1}, - "b": &modelpb.NumericLabelValue{Values: []float64{1.1, 1.2, 1.3, 1.4}}, - "d": &modelpb.NumericLabelValue{Value: 2}, - } - b := modelpb.NumericLabels{ - "a": &modelpb.NumericLabelValue{Value: 1}, - "b": &modelpb.NumericLabelValue{Values: []float64{1.1, 1.2, 1.3, 1.4}}, - "c": &modelpb.NumericLabelValue{Values: []float64{30, 20, 10}, Value: 1}, - } - assert.False(t, equalNumericLabels(a, b)) - assert.False(t, equalNumericLabels(b, a)) - }) - t.Run("false-values-not-match", func(t *testing.T) { - a := modelpb.NumericLabels{ - "a": &modelpb.NumericLabelValue{Value: 1}, - "b": &modelpb.NumericLabelValue{Values: []float64{1.1, 1.2, 1.3, 1.4}}, - "c": &modelpb.NumericLabelValue{Value: 2}, - } - b := modelpb.NumericLabels{ - "a": &modelpb.NumericLabelValue{Value: 1}, - "b": &modelpb.NumericLabelValue{Values: []float64{1.1, 1.2, 1.3, 1.4}}, - "c": &modelpb.NumericLabelValue{Values: []float64{30, 20, 10}, Value: 1}, - } - assert.False(t, equalNumericLabels(a, b)) - assert.False(t, equalNumericLabels(b, a)) - }) - t.Run("false-slices-length-not-match", func(t *testing.T) { - a := modelpb.NumericLabels{ - "a": &modelpb.NumericLabelValue{Value: 1}, - "b": &modelpb.NumericLabelValue{Values: []float64{1.1, 1.2, 1.3}}, - "c": &modelpb.NumericLabelValue{Values: []float64{30, 20, 10}, Value: 1}, - } - b := modelpb.NumericLabels{ - "a": &modelpb.NumericLabelValue{Value: 1}, - "b": &modelpb.NumericLabelValue{Values: []float64{1.1, 1.2, 1.3, 1.4}}, - "c": &modelpb.NumericLabelValue{Values: []float64{30, 20, 10}, Value: 1}, - } - assert.False(t, equalNumericLabels(a, b)) - assert.False(t, equalNumericLabels(b, a)) - }) - t.Run("false-slices-elements-not-match", func(t *testing.T) { - a := modelpb.NumericLabels{ - "a": &modelpb.NumericLabelValue{Value: 1}, - "b": &modelpb.NumericLabelValue{Values: []float64{1.1, 1.2, 1.3, 1.5}}, - "c": &modelpb.NumericLabelValue{Values: []float64{30, 20, 10}, Value: 1}, - } - b := modelpb.NumericLabels{ - "a": &modelpb.NumericLabelValue{Value: 1}, - "b": &modelpb.NumericLabelValue{Values: []float64{1.1, 1.2, 1.3, 1.4}}, - "c": &modelpb.NumericLabelValue{Values: []float64{30, 20, 10}, Value: 1}, - } - assert.False(t, equalNumericLabels(a, b)) - assert.False(t, equalNumericLabels(b, a)) - }) -} diff --git a/x-pack/apm-server/aggregation/lsm.go b/x-pack/apm-server/aggregation/lsm.go new file mode 100644 index 00000000000..eced10e6f39 --- /dev/null +++ b/x-pack/apm-server/aggregation/lsm.go @@ -0,0 +1,133 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License 2.0; +// you may not use this file except in compliance with the Elastic License 2.0. + +package aggregation + +import ( + "context" + "fmt" + "time" + + "go.opentelemetry.io/otel" + "go.uber.org/zap" + + "github.com/elastic/apm-aggregation/aggregationpb" + "github.com/elastic/apm-aggregation/aggregators" + "github.com/elastic/apm-data/model/modelpb" + "github.com/elastic/elastic-agent-libs/logp" +) + +type Aggregator struct { + logger *zap.Logger + baseaggregator *aggregators.Aggregator +} + +// New returns a new Aggregator. +func New( + maxSvcs, maxTxGroups, maxSvcTxGroups, maxSpanGroups int, + nextProcessor modelpb.BatchProcessor, logger *logp.Logger, +) (*Aggregator, error) { + zapLogger := zap.New(logger.Core(), zap.WithCaller(true)).Named("aggregator") + + baseaggregator, err := aggregators.New( + aggregators.WithLimits(aggregators.Limits{ + MaxSpanGroups: maxSpanGroups, + MaxSpanGroupsPerService: max(maxSpanGroups/10, 1), + MaxTransactionGroups: maxTxGroups, + MaxTransactionGroupsPerService: max(maxTxGroups/10, 1), + MaxServiceTransactionGroups: maxSvcTxGroups, + MaxServiceTransactionGroupsPerService: max(maxSvcTxGroups/10, 1), + MaxServiceInstanceGroupsPerService: max(maxSvcs/10, 1), + MaxServices: maxSvcs, + }), + aggregators.WithProcessor(wrapNextProcessor(nextProcessor)), + aggregators.WithAggregationIntervals([]time.Duration{time.Minute, 10 * time.Minute, time.Hour}), + aggregators.WithLogger(zapLogger), + aggregators.WithMeter(otel.GetMeterProvider().Meter("aggregator")), + aggregators.WithTracer(otel.GetTracerProvider().Tracer("aggregator")), + aggregators.WithInMemory(true), + ) + + if err != nil { + return nil, fmt.Errorf("failed to create base aggregator: %w", err) + } + agg := &Aggregator{ + logger: zapLogger, + baseaggregator: baseaggregator, + } + return agg, err +} + +// Run runs all the components of aggregator. +func (a *Aggregator) Run() error { + if err := a.baseaggregator.Run(context.Background()); err != aggregators.ErrAggregatorClosed { + return err + } + return nil +} + +// Stop stops all the component of aggregator. +func (a *Aggregator) Stop(ctx context.Context) error { + err := a.baseaggregator.Close(ctx) + if err != nil { + return fmt.Errorf("failed to stop aggregator: %w", err) + } + return nil +} + +// ProcessBatch implements modelpb.BatchProcessor interface +// so that aggregator can consume events from intake. +func (a *Aggregator) ProcessBatch(ctx context.Context, b *modelpb.Batch) error { + for _, e := range *b { + removeRUMGlobalLabels(e) + } + return a.baseaggregator.AggregateBatch(ctx, [16]byte{}, b) +} + +func wrapNextProcessor(processor modelpb.BatchProcessor) aggregators.Processor { + return func( + ctx context.Context, + cmk aggregators.CombinedMetricsKey, + cm *aggregationpb.CombinedMetrics, + aggregationIvl time.Duration, + ) error { + batch, err := aggregators.CombinedMetricsToBatch(cm, cmk.ProcessingTime, aggregationIvl) + if err != nil { + return fmt.Errorf("failed to convert combined metrics to batch: %w", err) + } + if err := processor.ProcessBatch( + ctx, + batch, + ); err != nil { + return fmt.Errorf("failed to process batch: %w", err) + } + return nil + } +} + +func removeRUMGlobalLabels(event *modelpb.APMEvent) { + // Remove global labels for RUM services to avoid explosion of metric groups + // to track for servicetxmetrics. + // For consistency, this will remove labels for other aggregated metrics as well. + switch event.GetAgent().GetName() { + case "rum-js", "js-base", "android/java", "iOS/swift": + default: + return + } + + // Setting the labels to non-global so that they are ignored by the aggregator. + for _, v := range event.Labels { + v.Global = false + } + for _, v := range event.NumericLabels { + v.Global = false + } +} + +func max(x, y int) int { + if x < y { + return y + } + return x +} diff --git a/x-pack/apm-server/aggregation/servicesummarymetrics/aggregator.go b/x-pack/apm-server/aggregation/servicesummarymetrics/aggregator.go deleted file mode 100644 index dd84ccdad85..00000000000 --- a/x-pack/apm-server/aggregation/servicesummarymetrics/aggregator.go +++ /dev/null @@ -1,370 +0,0 @@ -// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one -// or more contributor license agreements. Licensed under the Elastic License 2.0; -// you may not use this file except in compliance with the Elastic License 2.0. - -package servicesummarymetrics - -import ( - "context" - "encoding/binary" - "sync" - "sync/atomic" - "time" - - "github.com/axiomhq/hyperloglog" - "github.com/cespare/xxhash/v2" - "github.com/pkg/errors" - "google.golang.org/protobuf/types/known/timestamppb" - - "github.com/elastic/elastic-agent-libs/logp" - "github.com/elastic/elastic-agent-libs/monitoring" - - "github.com/elastic/apm-data/model/modelpb" - "github.com/elastic/apm-server/internal/logs" - "github.com/elastic/apm-server/x-pack/apm-server/aggregation/baseaggregator" - "github.com/elastic/apm-server/x-pack/apm-server/aggregation/interval" - "github.com/elastic/apm-server/x-pack/apm-server/aggregation/labels" -) - -const ( - metricsetName = "service_summary" - overflowServiceName = "_other" -) - -// AggregatorConfig holds configuration for creating an Aggregator. -type AggregatorConfig struct { - // BatchProcessor is a model.BatchProcessor for asynchronously - // processing metrics documents. - BatchProcessor modelpb.BatchProcessor - - // Logger is the logger for logging metrics aggregation/publishing. - // - // If Logger is nil, a new logger will be constructed. - Logger *logp.Logger - - // RollUpIntervals are additional MetricsInterval for the aggregator to - // compute and publish metrics for. Each additional interval is constrained - // to the same rules as MetricsInterval, and will result in additional - // memory to be allocated. - RollUpIntervals []time.Duration - - // Interval is the interval between publishing of aggregated metrics. - Interval time.Duration - - // MaxGroups is the maximum number of distinct service summary metrics to - // store within an aggregation period. Once this number of groups is - // reached, any new aggregation keys will be aggregated in a dedicated - // service group identified by `_other`. - MaxGroups int -} - -// Validate validates the aggregator config. -func (config AggregatorConfig) Validate() error { - if config.BatchProcessor == nil { - return errors.New("BatchProcessor unspecified") - } - if config.MaxGroups <= 0 { - return errors.New("MaxGroups unspecified or negative") - } - return nil -} - -// Aggregator aggregates all events, periodically publishing service summary metrics. -type Aggregator struct { - *baseaggregator.Aggregator - config AggregatorConfig - metrics *aggregatorMetrics - - mu sync.RWMutex - // These two metricsBuffer are set to the same size and act as buffers - // for caching and then publishing the metrics as batches. - active, inactive map[time.Duration]*metricsBuffer -} - -type aggregatorMetrics struct { - activeGroups int64 - overflow int64 -} - -// NewAggregator returns a new Aggregator with the given config. -func NewAggregator(config AggregatorConfig) (*Aggregator, error) { - if err := config.Validate(); err != nil { - return nil, errors.Wrap(err, "invalid aggregator config") - } - if config.Logger == nil { - config.Logger = logp.NewLogger(logs.ServiceSummaryMetrics) - } - aggregator := Aggregator{ - config: config, - metrics: &aggregatorMetrics{}, - active: make(map[time.Duration]*metricsBuffer), - inactive: make(map[time.Duration]*metricsBuffer), - } - base, err := baseaggregator.New(baseaggregator.AggregatorConfig{ - PublishFunc: aggregator.publish, // inject local publish - Logger: config.Logger, - Interval: config.Interval, - RollUpIntervals: config.RollUpIntervals, - }) - if err != nil { - return nil, err - } - aggregator.Aggregator = base - for _, interval := range aggregator.Intervals { - aggregator.active[interval] = newMetricsBuffer(config.MaxGroups) - aggregator.inactive[interval] = newMetricsBuffer(config.MaxGroups) - } - return &aggregator, nil -} - -// CollectMonitoring may be called to collect monitoring metrics from the -// aggregation. It is intended to be used with libbeat/monitoring.NewFunc. -// -// The metrics should be added to the "apm-server.aggregation.servicesummarymetrics" registry. -func (a *Aggregator) CollectMonitoring(_ monitoring.Mode, V monitoring.Visitor) { - V.OnRegistryStart() - defer V.OnRegistryFinished() - - activeGroups := int64(atomic.LoadInt64(&a.metrics.activeGroups)) - overflowed := int64(atomic.LoadInt64(&a.metrics.overflow)) - monitoring.ReportInt(V, "active_groups", activeGroups) - monitoring.ReportInt(V, "overflowed.total", overflowed) -} - -func (a *Aggregator) publish(ctx context.Context, period time.Duration) error { - // We hold a.mu only long enough to swap the serviceSummaryMetrics. This will - // be blocked by serviceSummaryMetrics updates, which is OK, as we prefer not - // to block serviceSummaryMetrics updaters. After the lock is released nothing - // will be accessing a.inactive. - a.mu.Lock() - - // EXPLAIN: We swap active <-> inactive, so that we're only working on the - // inactive property while publish is running. `a.active` is the buffer that - // receives/stores/updates the metricsets, once swapped, we're working on the - // `a.inactive` which we're going to process and publish. - current := a.active[period] - a.active[period], a.inactive[period] = a.inactive[period], current - a.mu.Unlock() - - if current.entries == 0 { - a.config.Logger.Debugf("no service summary metrics to publish") - return nil - } - - size := current.entries - if current.other != nil { - size++ - } - - intervalStr := interval.FormatDuration(period) - isMetricsPeriod := period == a.config.Interval - batch := make(modelpb.Batch, 0, size) - for key, metrics := range current.m { - for _, entry := range metrics { - m := makeMetricset(*entry, intervalStr) - batch = append(batch, m) - } - delete(current.m, key) - } - if current.other != nil { - overflowCount := current.otherCardinalityEstimator.Estimate() - if isMetricsPeriod { - atomic.AddInt64(&a.metrics.activeGroups, int64(current.entries)) - atomic.AddInt64(&a.metrics.overflow, int64(overflowCount)) - } - m := makeMetricset(*current.other, intervalStr) - m.Metricset.Samples = append(m.Metricset.Samples, &modelpb.MetricsetSample{ - Name: "service_summary.aggregation.overflow_count", - Value: float64(overflowCount), - }) - batch = append(batch, m) - } - - // Clean up everything. - current.entries = 0 - current.other = nil - current.otherCardinalityEstimator = nil - - a.config.Logger.Debugf("publishing %d metricsets", len(batch)) - return a.config.BatchProcessor.ProcessBatch(ctx, &batch) -} - -// ProcessBatch aggregates all service summary metrics. -func (a *Aggregator) ProcessBatch(ctx context.Context, b *modelpb.Batch) error { - a.mu.RLock() - defer a.mu.RUnlock() - for _, event := range *b { - if event.Type() == modelpb.SpanEventType { - // Ignoring spans since they add no value. - continue - } - a.processEvent(event) - } - return nil -} - -func (a *Aggregator) processEvent(event *modelpb.APMEvent) { - for _, interval := range a.Intervals { - key := makeAggregationKey(event, interval) - a.active[interval].storeOrUpdate(key, interval, a.config.Logger) - } -} - -type metricsBuffer struct { - mu sync.RWMutex - m map[uint64][]*aggregationKey - other *aggregationKey - otherCardinalityEstimator *hyperloglog.Sketch - - // Number of aggregation keys in m, excluding overflow bucket. - entries int - - maxSize int -} - -func newMetricsBuffer(maxSize int) *metricsBuffer { - return &metricsBuffer{ - maxSize: maxSize, - m: make(map[uint64][]*aggregationKey), - } -} - -func (mb *metricsBuffer) storeOrUpdate( - key aggregationKey, - interval time.Duration, - logger *logp.Logger, -) { - hash := key.hash() - - mb.mu.Lock() - defer mb.mu.Unlock() - - // Search in hash table with separate chaining. - entries, ok := mb.m[hash] - if ok { - ok = false - for _, old := range entries { - if old.equal(key) { - ok = true - break - } - } - } - - if ok { - return - } - - if mb.entries >= mb.maxSize { - if mb.otherCardinalityEstimator == nil { - logger.Warnf(` -Service aggregation group limit of %d reached, new metric documents will be grouped -under a dedicated bucket identified by service name '%s'.`[1:], mb.maxSize, overflowServiceName) - key = makeOverflowAggregationKey(interval) - mb.other = &key - mb.otherCardinalityEstimator = hyperloglog.New14() - } - mb.otherCardinalityEstimator.InsertHash(hash) - } else { - mb.m[hash] = append(mb.m[hash], &key) - mb.entries++ - } -} - -type aggregationKey struct { - labels.AggregatedGlobalLabels - comparable -} - -func (k *aggregationKey) hash() uint64 { - var h xxhash.Digest - var buf [8]byte - binary.LittleEndian.PutUint64(buf[:], uint64(k.timestamp.UnixNano())) - h.Write(buf[:]) - - k.AggregatedGlobalLabels.Write(&h) - h.WriteString(k.agentName) - h.WriteString(k.serviceEnvironment) - h.WriteString(k.serviceName) - h.WriteString(k.serviceLanguageName) - return h.Sum64() -} - -func (k *aggregationKey) equal(key aggregationKey) bool { - return k.comparable == key.comparable && - k.AggregatedGlobalLabels.Equals(&key.AggregatedGlobalLabels) -} - -type comparable struct { - timestamp time.Time - - agentName string - serviceName string - serviceEnvironment string - serviceLanguageName string -} - -func makeAggregationKey(event *modelpb.APMEvent, interval time.Duration) aggregationKey { - key := aggregationKey{ - comparable: comparable{ - agentName: event.GetAgent().GetName(), - serviceName: event.GetService().GetName(), - serviceEnvironment: event.GetService().GetEnvironment(), - serviceLanguageName: event.GetService().GetLanguage().GetName(), - }, - } - if event.Timestamp != nil { - // Group metrics by time interval. - key.comparable.timestamp = event.Timestamp.AsTime().Truncate(interval) - } - key.AggregatedGlobalLabels.Read(event) - return key -} - -func makeOverflowAggregationKey(interval time.Duration) aggregationKey { - return aggregationKey{ - comparable: comparable{ - // We are using `time.Now` here to align the overflow aggregation to - // the evaluation time rather than event time. This prevents us from - // cases of bad timestamps when the server receives some events with - // old timestamp and these events overflow causing the indexed event - // to have old timestamp too. - timestamp: time.Now().Truncate(interval), - serviceName: overflowServiceName, - }, - } -} - -func makeMetricset(key aggregationKey, interval string) *modelpb.APMEvent { - var t *timestamppb.Timestamp - if !key.timestamp.IsZero() { - t = timestamppb.New(key.timestamp) - } - var agent *modelpb.Agent - if key.agentName != "" { - agent = &modelpb.Agent{Name: key.agentName} - } - - var language *modelpb.Language - if key.serviceLanguageName != "" { - language = &modelpb.Language{ - Name: key.serviceLanguageName, - } - } - - return &modelpb.APMEvent{ - Timestamp: t, - Service: &modelpb.Service{ - Name: key.serviceName, - Environment: key.serviceEnvironment, - Language: language, - }, - Agent: agent, - Labels: key.Labels, - NumericLabels: key.NumericLabels, - Metricset: &modelpb.Metricset{ - Name: metricsetName, - Interval: interval, - }, - } -} diff --git a/x-pack/apm-server/aggregation/servicesummarymetrics/aggregator_test.go b/x-pack/apm-server/aggregation/servicesummarymetrics/aggregator_test.go deleted file mode 100644 index 763131ec5fe..00000000000 --- a/x-pack/apm-server/aggregation/servicesummarymetrics/aggregator_test.go +++ /dev/null @@ -1,376 +0,0 @@ -// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one -// or more contributor license agreements. Licensed under the Elastic License 2.0; -// you may not use this file except in compliance with the Elastic License 2.0. - -package servicesummarymetrics - -import ( - "context" - "fmt" - "sort" - "sync" - "testing" - "time" - - "github.com/google/go-cmp/cmp" - "github.com/google/go-cmp/cmp/cmpopts" - "google.golang.org/protobuf/testing/protocmp" - "google.golang.org/protobuf/types/known/durationpb" - "google.golang.org/protobuf/types/known/timestamppb" - - "go.opentelemetry.io/collector/pdata/plog" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/elastic/apm-data/model/modelpb" - "github.com/elastic/elastic-agent-libs/monitoring" -) - -func TestNewAggregatorConfigInvalid(t *testing.T) { - report := makeErrBatchProcessor(nil) - - type test struct { - config AggregatorConfig - err string - } - - for _, test := range []test{{ - config: AggregatorConfig{}, - err: "BatchProcessor unspecified", - }, { - config: AggregatorConfig{ - BatchProcessor: report, - }, - err: "MaxGroups unspecified or negative", - }, { - config: AggregatorConfig{ - BatchProcessor: report, - MaxGroups: 1, - }, - err: "Interval unspecified or negative", - }} { - agg, err := NewAggregator(test.config) - require.Error(t, err) - require.Nil(t, agg) - assert.EqualError(t, err, "invalid aggregator config: "+test.err) - } -} - -func TestAggregatorRun(t *testing.T) { - batches := make(chan modelpb.Batch, 3) - config := AggregatorConfig{ - BatchProcessor: makeChanBatchProcessor(batches), - Interval: 1 * time.Millisecond, - RollUpIntervals: []time.Duration{200 * time.Millisecond, time.Second}, - MaxGroups: 1000, - } - agg, err := NewAggregator(config) - require.NoError(t, err) - - apmEvents := []*modelpb.APMEvent{ - { - Agent: &modelpb.Agent{Name: "java"}, - Service: &modelpb.Service{Name: "backend", Language: &modelpb.Language{Name: "java"}}, - Event: &modelpb.Event{ - Outcome: "success", - Duration: durationpb.New(time.Millisecond), - }, - Transaction: &modelpb.Transaction{ - Name: "transaction_name", - Type: "request", - RepresentativeCount: 1, - }, - Labels: modelpb.Labels{ - "department_name": &modelpb.LabelValue{Global: true, Value: "apm"}, - "organization": &modelpb.LabelValue{Global: true, Value: "observability"}, - "company": &modelpb.LabelValue{Global: true, Value: "elastic"}, - }, - NumericLabels: modelpb.NumericLabels{ - "user_id": &modelpb.NumericLabelValue{Global: true, Value: 100}, - "cost_center": &modelpb.NumericLabelValue{Global: true, Value: 10}, - }, - }, - { - Agent: &modelpb.Agent{ - Name: "java", - Version: "unknown", - }, - Service: &modelpb.Service{ - Name: "backend", - Language: &modelpb.Language{Name: "java"}, - }, - Message: "a random log message", - Event: &modelpb.Event{ - Severity: uint64(plog.SeverityNumberInfo), - }, - Log: &modelpb.Log{Level: "Info"}, - Span: &modelpb.Span{Id: "0200000000000000"}, - Trace: &modelpb.Trace{Id: "01000000000000000000000000000000"}, - Labels: modelpb.Labels{ - "department_name": &modelpb.LabelValue{Global: true, Value: "apm"}, - "organization": &modelpb.LabelValue{Global: true, Value: "observability"}, - "company": &modelpb.LabelValue{Global: true, Value: "elastic"}, - }, - NumericLabels: modelpb.NumericLabels{ - "user_id": &modelpb.NumericLabelValue{Global: true, Value: 100}, - "cost_center": &modelpb.NumericLabelValue{Global: true, Value: 10}, - }, - }, - { - Agent: &modelpb.Agent{ - Name: "go", - }, - Service: &modelpb.Service{ - Name: "backend", - Language: &modelpb.Language{Name: "go"}, - }, - Error: &modelpb.Error{}, - }, - { - Agent: &modelpb.Agent{ - Name: "go", - }, - Service: &modelpb.Service{ - Name: "backend", - Environment: "dev", - Language: &modelpb.Language{Name: "go"}, - }, - }, - { - Agent: &modelpb.Agent{ - Name: "js-base", - }, - Service: &modelpb.Service{ - Name: "frontend", - }, - Span: &modelpb.Span{ - Type: "span_type", - }, - }, - } - - var wg sync.WaitGroup - for _, in := range apmEvents { - wg.Add(1) - go func(in *modelpb.APMEvent) { - defer wg.Done() - batch := modelpb.Batch{in} - err := agg.ProcessBatch(context.Background(), &batch) - require.NoError(t, err) - assert.Equal(t, modelpb.Batch{in}, batch) - }(in) - } - wg.Wait() - - // Start the aggregator after processing to ensure metrics are aggregated deterministically. - go agg.Run() - defer agg.Stop(context.Background()) - // Stop the aggregator to ensure all metrics are published. - assert.NoError(t, agg.Stop(context.Background())) - - for _, interval := range append([]time.Duration{config.Interval}, config.RollUpIntervals...) { - batch := expectBatch(t, batches) - metricsets := batchMetricsets(t, batch) - expected := []*modelpb.APMEvent{{ - Metricset: &modelpb.Metricset{ - Name: "service_summary", Interval: fmt.Sprintf("%.0fs", interval.Seconds()), - }, - Service: &modelpb.Service{Name: "backend", Language: &modelpb.Language{Name: "java"}}, - Agent: &modelpb.Agent{Name: "java"}, - Labels: modelpb.Labels{ - "department_name": &modelpb.LabelValue{Value: "apm"}, - "organization": &modelpb.LabelValue{Value: "observability"}, - "company": &modelpb.LabelValue{Value: "elastic"}, - }, - NumericLabels: modelpb.NumericLabels{ - "user_id": &modelpb.NumericLabelValue{Value: 100}, - "cost_center": &modelpb.NumericLabelValue{Value: 10}, - }, - }, { - Metricset: &modelpb.Metricset{ - Name: "service_summary", Interval: fmt.Sprintf("%.0fs", interval.Seconds()), - }, - Service: &modelpb.Service{Name: "backend", Language: &modelpb.Language{Name: "go"}}, - Agent: &modelpb.Agent{Name: "go"}, - }, { - Metricset: &modelpb.Metricset{ - Name: "service_summary", Interval: fmt.Sprintf("%.0fs", interval.Seconds()), - }, - Service: &modelpb.Service{Name: "backend", Environment: "dev", Language: &modelpb.Language{Name: "go"}}, - Agent: &modelpb.Agent{Name: "go"}, - }} - - assert.Equal(t, len(expected), len(metricsets)) - assert.Empty(t, cmp.Diff(expected, metricsets, - protocmp.Transform(), - cmpopts.SortSlices(func(e1 *modelpb.APMEvent, e2 *modelpb.APMEvent) bool { - if e1.Agent.Name != e2.Agent.Name { - return e1.Agent.Name < e2.Agent.Name - } - - return e1.Service.Environment < e2.Service.Environment - - }), - )) - } - - select { - case <-batches: - t.Fatal("unexpected publish") - case <-time.After(100 * time.Millisecond): - } -} - -func TestAggregateTimestamp(t *testing.T) { - batches := make(chan modelpb.Batch, 1) - agg, err := NewAggregator(AggregatorConfig{ - BatchProcessor: makeChanBatchProcessor(batches), - Interval: 30 * time.Second, - MaxGroups: 1000, - }) - require.NoError(t, err) - - t0 := time.Unix(0, 0).UTC() - for _, ts := range []time.Time{t0, t0.Add(15 * time.Second), t0.Add(30 * time.Second)} { - transaction := makeTransaction("service_name", "agent_name", "", "tx_type", "success", 100*time.Millisecond, 1) - transaction.Timestamp = timestamppb.New(ts) - batch := modelpb.Batch{transaction} - err = agg.ProcessBatch(context.Background(), &batch) - require.NoError(t, err) - assert.Empty(t, batchMetricsets(t, batch)) - } - - go agg.Run() - err = agg.Stop(context.Background()) // stop to flush - require.NoError(t, err) - - batch := expectBatch(t, batches) - metricsets := batchMetricsets(t, batch) - require.Len(t, metricsets, 2) - sort.Slice(metricsets, func(i, j int) bool { - return metricsets[i].Timestamp.AsTime().Before(metricsets[j].Timestamp.AsTime()) - }) - assert.Equal(t, t0, metricsets[0].Timestamp.AsTime()) - assert.Equal(t, t0.Add(30*time.Second), metricsets[1].Timestamp.AsTime()) -} - -func TestAggregatorOverflow(t *testing.T) { - maxGrps := 4 - overflowCount := 100 - txnDuration := 100 * time.Millisecond - batches := make(chan modelpb.Batch, 1) - agg, err := NewAggregator(AggregatorConfig{ - BatchProcessor: makeChanBatchProcessor(batches), - Interval: 10 * time.Second, - MaxGroups: maxGrps, - }) - require.NoError(t, err) - - batch := make(modelpb.Batch, maxGrps+overflowCount) // cause overflow - for i := 0; i < len(batch); i++ { - batch[i] = makeTransaction( - fmt.Sprintf("svc%d", i), "java", "agent", "tx_type", "success", txnDuration, 1, - ) - } - go func(t *testing.T) { - t.Helper() - require.NoError(t, agg.Run()) - }(t) - require.NoError(t, agg.ProcessBatch(context.Background(), &batch)) - require.NoError(t, agg.Stop(context.Background())) - metricsets := batchMetricsets(t, expectBatch(t, batches)) - require.Len(t, metricsets, maxGrps+1) // only one `other` metric should overflow - - // assert monitoring - registry := monitoring.NewRegistry() - monitoring.NewFunc(registry, "servicesummarymetrics", agg.CollectMonitoring) - expectedMonitoring := monitoring.MakeFlatSnapshot() - expectedMonitoring.Ints["servicesummarymetrics.active_groups"] = int64(maxGrps) - expectedMonitoring.Ints["servicesummarymetrics.overflowed.total"] = int64(overflowCount) - - var overflowEvent *modelpb.APMEvent - for i := range metricsets { - m := metricsets[i] - if m.Service.Name == "_other" { - if overflowEvent != nil { - require.Fail(t, "only one service should overflow") - } - overflowEvent = m - } - } - assert.Empty(t, cmp.Diff(&modelpb.APMEvent{ - Service: &modelpb.Service{ - Name: "_other", - }, - Metricset: &modelpb.Metricset{ - Name: "service_summary", - Interval: "10s", - Samples: []*modelpb.MetricsetSample{ - { - Name: "service_summary.aggregation.overflow_count", - Value: float64(overflowCount), - }, - }, - }, - }, overflowEvent, - protocmp.Transform(), - protocmp.IgnoreFields(&modelpb.APMEvent{}, "timestamp"), - )) -} - -func makeTransaction( - serviceName, serviceLanguageName, agentName, transactionType, outcome string, - duration time.Duration, count float64, -) *modelpb.APMEvent { - return &modelpb.APMEvent{ - Agent: &modelpb.Agent{Name: agentName}, - Service: &modelpb.Service{Name: serviceName, Language: &modelpb.Language{Name: serviceLanguageName}}, - Event: &modelpb.Event{ - Outcome: outcome, - Duration: durationpb.New(duration), - }, - Transaction: &modelpb.Transaction{ - Name: "transaction_name", - Type: transactionType, - RepresentativeCount: count, - }, - } -} - -func makeErrBatchProcessor(err error) modelpb.BatchProcessor { - return modelpb.ProcessBatchFunc(func(context.Context, *modelpb.Batch) error { return err }) -} - -func makeChanBatchProcessor(ch chan<- modelpb.Batch) modelpb.BatchProcessor { - return modelpb.ProcessBatchFunc(func(ctx context.Context, batch *modelpb.Batch) error { - select { - case <-ctx.Done(): - return ctx.Err() - case ch <- *batch: - return nil - } - }) -} - -func expectBatch(t *testing.T, ch <-chan modelpb.Batch) modelpb.Batch { - t.Helper() - select { - case batch := <-ch: - return batch - case <-time.After(time.Second * 5): - t.Fatal("expected publish") - } - panic("unreachable") -} - -func batchMetricsets(t testing.TB, batch modelpb.Batch) []*modelpb.APMEvent { - var metricsets []*modelpb.APMEvent - for _, event := range batch { - if event.Metricset == nil { - continue - } - metricsets = append(metricsets, event) - } - return metricsets -} diff --git a/x-pack/apm-server/aggregation/servicetxmetrics/aggregator.go b/x-pack/apm-server/aggregation/servicetxmetrics/aggregator.go deleted file mode 100644 index 3036a4d059e..00000000000 --- a/x-pack/apm-server/aggregation/servicetxmetrics/aggregator.go +++ /dev/null @@ -1,527 +0,0 @@ -// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one -// or more contributor license agreements. Licensed under the Elastic License 2.0; -// you may not use this file except in compliance with the Elastic License 2.0. - -package servicetxmetrics - -import ( - "context" - "encoding/binary" - "math" - "sync" - "sync/atomic" - "time" - - "github.com/axiomhq/hyperloglog" - "github.com/cespare/xxhash/v2" - "github.com/pkg/errors" - "google.golang.org/protobuf/types/known/timestamppb" - - "github.com/elastic/elastic-agent-libs/logp" - "github.com/elastic/elastic-agent-libs/monitoring" - "github.com/elastic/go-hdrhistogram" - - "github.com/elastic/apm-data/model/modelpb" - "github.com/elastic/apm-server/internal/logs" - "github.com/elastic/apm-server/x-pack/apm-server/aggregation/baseaggregator" - "github.com/elastic/apm-server/x-pack/apm-server/aggregation/interval" - "github.com/elastic/apm-server/x-pack/apm-server/aggregation/labels" -) - -const ( - metricsetName = "service_transaction" - overflowServiceName = "_other" - - minDuration time.Duration = 0 - maxDuration time.Duration = time.Hour - - histogramCountScale = 1000 -) - -// AggregatorConfig holds configuration for creating an Aggregator. -type AggregatorConfig struct { - // BatchProcessor is a model.BatchProcessor for asynchronously - // processing metrics documents. - BatchProcessor modelpb.BatchProcessor - - // Logger is the logger for logging metrics aggregation/publishing. - // - // If Logger is nil, a new logger will be constructed. - Logger *logp.Logger - - // RollUpIntervals are additional MetricsInterval for the aggregator to - // compute and publish metrics for. Each additional interval is constrained - // to the same rules as MetricsInterval, and will result in additional - // memory to be allocated. - RollUpIntervals []time.Duration - - // Interval is the interval between publishing of aggregated metrics. - // There may be additional metrics reported at arbitrary times if the - // aggregation groups fill up. - Interval time.Duration - - // MaxGroups is the maximum number of distinct service transaction metrics - // to store within an aggregation period. Once this number of groups is - // reached, any new aggregation keys will be aggregated in a dedicated - // service group identified by `_other`. - MaxGroups int - - // HDRHistogramSignificantFigures is the number of significant figures - // to maintain in the HDR Histograms. HDRHistogramSignificantFigures - // must be in the range [1,5]. - HDRHistogramSignificantFigures int -} - -// Validate validates the aggregator config. -func (config AggregatorConfig) Validate() error { - if config.BatchProcessor == nil { - return errors.New("BatchProcessor unspecified") - } - if config.MaxGroups <= 0 { - return errors.New("MaxGroups unspecified or negative") - } - if n := config.HDRHistogramSignificantFigures; n < 1 || n > 5 { - return errors.Errorf("HDRHistogramSignificantFigures (%d) outside range [1,5]", n) - } - return nil -} - -// Aggregator aggregates service latency and throughput, periodically publishing service transaction metrics. -type Aggregator struct { - *baseaggregator.Aggregator - config AggregatorConfig - metrics *aggregatorMetrics - - mu sync.RWMutex - // These two metricsBuffer are set to the same size and act as buffers - // for caching and then publishing the metrics as batches. - active, inactive map[time.Duration]*metricsBuffer - - histogramPool sync.Pool -} - -type aggregatorMetrics struct { - activeGroups int64 - overflow int64 -} - -// NewAggregator returns a new Aggregator with the given config. -func NewAggregator(config AggregatorConfig) (*Aggregator, error) { - if err := config.Validate(); err != nil { - return nil, errors.Wrap(err, "invalid aggregator config") - } - if config.Logger == nil { - config.Logger = logp.NewLogger(logs.ServiceTransactionMetrics) - } - aggregator := Aggregator{ - config: config, - metrics: &aggregatorMetrics{}, - active: make(map[time.Duration]*metricsBuffer), - inactive: make(map[time.Duration]*metricsBuffer), - histogramPool: sync.Pool{New: func() interface{} { - return hdrhistogram.New( - minDuration.Microseconds(), - maxDuration.Microseconds(), - config.HDRHistogramSignificantFigures, - ) - }}, - } - base, err := baseaggregator.New(baseaggregator.AggregatorConfig{ - PublishFunc: aggregator.publish, // inject local publish - Logger: config.Logger, - Interval: config.Interval, - RollUpIntervals: config.RollUpIntervals, - }) - if err != nil { - return nil, err - } - aggregator.Aggregator = base - for _, interval := range aggregator.Intervals { - aggregator.active[interval] = newMetricsBuffer(config.MaxGroups, &aggregator.histogramPool) - aggregator.inactive[interval] = newMetricsBuffer(config.MaxGroups, &aggregator.histogramPool) - } - return &aggregator, nil -} - -// CollectMonitoring may be called to collect monitoring metrics from the -// aggregation. It is intended to be used with libbeat/monitoring.NewFunc. -// -// The metrics should be added to the "apm-server.aggregation.servicetxmetrics" registry. -func (a *Aggregator) CollectMonitoring(_ monitoring.Mode, V monitoring.Visitor) { - V.OnRegistryStart() - defer V.OnRegistryFinished() - - activeGroups := int64(atomic.LoadInt64(&a.metrics.activeGroups)) - overflowed := int64(atomic.LoadInt64(&a.metrics.overflow)) - monitoring.ReportInt(V, "active_groups", activeGroups) - monitoring.ReportInt(V, "overflowed.total", overflowed) -} - -func (a *Aggregator) publish(ctx context.Context, period time.Duration) error { - // We hold a.mu only long enough to swap the serviceTxMetrics. This will - // be blocked by serviceTxMetrics updates, which is OK, as we prefer not - // to block serviceTxMetrics updaters. After the lock is released nothing - // will be accessing a.inactive. - a.mu.Lock() - - // EXPLAIN: We swap active <-> inactive, so that we're only working on the - // inactive property while publish is running. `a.active` is the buffer that - // receives/stores/updates the metricsets, once swapped, we're working on the - // `a.inactive` which we're going to process and publish. - current := a.active[period] - a.active[period], a.inactive[period] = a.inactive[period], current - a.mu.Unlock() - - if current.entries == 0 { - a.config.Logger.Debugf("no service transaction metrics to publish") - return nil - } - - size := current.entries - if current.other != nil { - size++ - } - - isMetricsPeriod := period == a.config.Interval - intervalStr := interval.FormatDuration(period) - batch := make(modelpb.Batch, 0, size) - for key, metrics := range current.m { - for _, entry := range metrics { - // Record the metricset interval as metricset.interval. - m := makeMetricset(entry.aggregationKey, entry.serviceTxMetrics, intervalStr) - batch = append(batch, m) - entry.histogram.Reset() - a.histogramPool.Put(entry.histogram) - entry.histogram = nil - } - delete(current.m, key) - } - if current.other != nil { - overflowCount := current.otherCardinalityEstimator.Estimate() - if isMetricsPeriod { - atomic.AddInt64(&a.metrics.activeGroups, int64(current.entries)) - atomic.AddInt64(&a.metrics.overflow, int64(overflowCount)) - } - entry := current.other - // Record the metricset interval as metricset.interval. - m := makeMetricset(entry.aggregationKey, entry.serviceTxMetrics, intervalStr) - m.Metricset.Samples = append(m.Metricset.Samples, &modelpb.MetricsetSample{ - Name: "service_transaction.aggregation.overflow_count", - Value: float64(overflowCount), - }) - batch = append(batch, m) - entry.histogram.Reset() - a.histogramPool.Put(entry.histogram) - entry.histogram = nil - current.other = nil - current.otherCardinalityEstimator = nil - } - current.entries = 0 - a.config.Logger.Debugf("publishing %d metricsets", len(batch)) - return a.config.BatchProcessor.ProcessBatch(ctx, &batch) -} - -// ProcessBatch aggregates all service latency metrics. -// -// To contain cardinality of the aggregated metrics the following -// limits are considered: -// -// - MaxGroups: Limits the total number of services that the -// service transaction metrics aggregator produces. Once this limit is -// breached the metrics are aggregated in a dedicated bucket -// with `service.name` as `_other`. -func (a *Aggregator) ProcessBatch(ctx context.Context, b *modelpb.Batch) error { - a.mu.RLock() - defer a.mu.RUnlock() - for _, event := range *b { - tx := event.Transaction - if event.Type() == modelpb.TransactionEventType && tx != nil { - a.processTransaction(event) - } - } - return nil -} - -func (a *Aggregator) processTransaction(event *modelpb.APMEvent) { - if event.Transaction == nil || event.Transaction.RepresentativeCount <= 0 { - return - } - for _, interval := range a.Intervals { - key := makeAggregationKey(event, interval) - metrics := makeServiceTxMetrics(event) - a.active[interval].storeOrUpdate(key, metrics, interval, a.config.Logger) - } -} - -type metricsBuffer struct { - mu sync.RWMutex - m map[uint64][]*metricsMapEntry - other *metricsMapEntry - otherCardinalityEstimator *hyperloglog.Sketch - space []metricsMapEntry - entries int - - maxSize int - - histogramPool *sync.Pool -} - -func newMetricsBuffer(maxSize int, histogramPool *sync.Pool) *metricsBuffer { - return &metricsBuffer{ - maxSize: maxSize, - // keep one reserved entry for overflow bucket - space: make([]metricsMapEntry, maxSize+1), - m: make(map[uint64][]*metricsMapEntry), - histogramPool: histogramPool, - } -} - -type metricsMapEntry struct { - aggregationKey - serviceTxMetrics -} - -func (mb *metricsBuffer) storeOrUpdate( - key aggregationKey, - metrics serviceTxMetrics, - interval time.Duration, - logger *logp.Logger, -) { - // hash does not use the serviceTxMetrics so it is safe to call concurrently. - hash := key.hash() - - // Full lock because serviceTxMetrics cannot be updated atomically. - mb.mu.Lock() - defer mb.mu.Unlock() - - var entry *metricsMapEntry - entries, ok := mb.m[hash] - if ok { - for offset, old := range entries { - if old.aggregationKey.equal(key) { - entry = entries[offset] - break - } - } - } - if entry == nil && mb.entries >= mb.maxSize && mb.other != nil { - entry = mb.other - // axiomhq/hyerloglog uses metrohash but here we are using - // xxhash. Metrohash has better performance but since we are - // already calculating xxhash we can use it directly. - mb.otherCardinalityEstimator.InsertHash(hash) - } - if entry != nil { - entry.recordMetrics(metrics) - return - } - if mb.entries >= mb.maxSize { - logger.Warnf(` -Service aggregation group limit of %d reached, new metric documents will be grouped -under a dedicated bucket identified by service name '%s'.`[1:], mb.maxSize, overflowServiceName) - mb.other = &mb.space[len(mb.space)-1] - mb.otherCardinalityEstimator = hyperloglog.New14() - mb.otherCardinalityEstimator.InsertHash(hash) - entry = mb.other - key = makeOverflowAggregationKey(key, interval) - } else { - entry = &mb.space[mb.entries] - mb.m[hash] = append(entries, entry) - mb.entries++ - } - entry.aggregationKey = key - entry.serviceTxMetrics = serviceTxMetrics{ - histogram: mb.histogramPool.Get().(*hdrhistogram.Histogram), - } - entry.recordMetrics(metrics) -} - -type aggregationKey struct { - labels.AggregatedGlobalLabels - comparable -} - -func (k *aggregationKey) hash() uint64 { - var h xxhash.Digest - var buf [8]byte - binary.LittleEndian.PutUint64(buf[:], uint64(k.timestamp.UnixNano())) - h.Write(buf[:]) - - k.AggregatedGlobalLabels.Write(&h) - h.WriteString(k.agentName) - h.WriteString(k.serviceEnvironment) - h.WriteString(k.serviceName) - h.WriteString(k.serviceLanguageName) - h.WriteString(k.transactionType) - return h.Sum64() -} - -func (k *aggregationKey) equal(key aggregationKey) bool { - return k.comparable == key.comparable && - k.AggregatedGlobalLabels.Equals(&key.AggregatedGlobalLabels) -} - -type comparable struct { - timestamp time.Time - - agentName string - serviceName string - serviceEnvironment string - serviceLanguageName string - transactionType string -} - -func makeAggregationKey(event *modelpb.APMEvent, interval time.Duration) aggregationKey { - key := aggregationKey{ - comparable: comparable{ - - agentName: event.GetAgent().GetName(), - serviceName: event.GetService().GetName(), - serviceEnvironment: event.GetService().GetEnvironment(), - serviceLanguageName: event.GetService().GetLanguage().GetName(), - transactionType: event.GetTransaction().GetType(), - }, - } - if event.Timestamp != nil { - // Group metrics by time interval. - key.comparable.timestamp = event.Timestamp.AsTime().Truncate(interval) - } - key.AggregatedGlobalLabels.Read(event) - return key -} - -func makeOverflowAggregationKey(oldKey aggregationKey, interval time.Duration) aggregationKey { - return aggregationKey{ - comparable: comparable{ - // We are using `time.Now` here to align the overflow aggregation to - // the evaluation time rather than event time. This prevents us from - // cases of bad timestamps when the server receives some events with - // old timestamp and these events overflow causing the indexed event - // to have old timestamp too. - timestamp: time.Now().Truncate(interval), - serviceName: overflowServiceName, - }, - } -} - -type serviceTxMetrics struct { - histogram *hdrhistogram.Histogram - transactionDuration float64 - transactionCount float64 - failureCount float64 - successCount float64 -} - -func (m *serviceTxMetrics) recordMetrics(other serviceTxMetrics) { - m.transactionCount += other.transactionCount - m.transactionDuration += other.transactionDuration * other.transactionCount - m.successCount += other.successCount - m.failureCount += other.failureCount - - count := int64(math.Round(other.transactionCount * histogramCountScale)) - m.histogram.RecordValuesAtomic(time.Duration(other.transactionDuration).Microseconds(), count) -} - -func (m *serviceTxMetrics) histogramBuckets() (totalCount uint64, counts []uint64, values []float64) { - // From https://www.elastic.co/guide/en/elasticsearch/reference/current/histogram.html: - // - // "For the High Dynamic Range (HDR) histogram mode, the values array represents - // fixed upper limits of each bucket interval, and the counts array represents - // the number of values that are attributed to each interval." - distribution := m.histogram.Distribution() - counts = make([]uint64, 0, len(distribution)) - values = make([]float64, 0, len(distribution)) - for _, b := range distribution { - if b.Count <= 0 { - continue - } - count := uint64(math.Round(float64(b.Count) / histogramCountScale)) - counts = append(counts, count) - values = append(values, float64(b.To)) - totalCount += count - } - return totalCount, counts, values -} - -func makeServiceTxMetrics(event *modelpb.APMEvent) serviceTxMetrics { - transactionCount := event.Transaction.RepresentativeCount - metrics := serviceTxMetrics{ - transactionDuration: float64(event.Event.Duration.AsDuration()), - transactionCount: transactionCount, - } - switch event.Event.Outcome { - case "failure": - metrics.failureCount = transactionCount - case "success": - metrics.successCount = transactionCount - } - return metrics -} - -// makeMetricset creates a metricset with key, metrics, and interval. -// It uses result from histogram for Transaction.DurationSummary and DocCount to avoid discrepancy and UI weirdness. -// Event.SuccessCount will maintain separate counts, which may be different from histogram count, -// but is acceptable since it is used for calculating error ratio. -func makeMetricset(key aggregationKey, metrics serviceTxMetrics, interval string) *modelpb.APMEvent { - totalCount, counts, values := metrics.histogramBuckets() - - transactionDurationSummary := modelpb.SummaryMetric{ - Count: totalCount, - } - for i, v := range values { - transactionDurationSummary.Sum += v * float64(counts[i]) - } - - var t *timestamppb.Timestamp - if !key.timestamp.IsZero() { - t = timestamppb.New(key.timestamp) - } - - var event *modelpb.Event - if metrics.successCount != 0 || metrics.failureCount != 0 { - event = &modelpb.Event{ - SuccessCount: &modelpb.SummaryMetric{ - Count: uint64(math.Round(metrics.successCount + metrics.failureCount)), - Sum: math.Round(metrics.successCount), - }, - } - } - - var agent *modelpb.Agent - if key.agentName != "" { - agent = &modelpb.Agent{Name: key.agentName} - } - - var language *modelpb.Language - if key.serviceLanguageName != "" { - language = &modelpb.Language{ - Name: key.serviceLanguageName, - } - } - - return &modelpb.APMEvent{ - Timestamp: t, - Service: &modelpb.Service{ - Name: key.serviceName, - Environment: key.serviceEnvironment, - Language: language, - }, - Agent: agent, - Labels: key.Labels, - NumericLabels: key.NumericLabels, - Metricset: &modelpb.Metricset{ - DocCount: totalCount, - Name: metricsetName, - Interval: interval, - }, - Transaction: &modelpb.Transaction{ - Type: key.transactionType, - DurationSummary: &transactionDurationSummary, - DurationHistogram: &modelpb.Histogram{ - Counts: counts, - Values: values, - }, - }, - Event: event, - } -} diff --git a/x-pack/apm-server/aggregation/servicetxmetrics/aggregator_test.go b/x-pack/apm-server/aggregation/servicetxmetrics/aggregator_test.go deleted file mode 100644 index 92c24173b76..00000000000 --- a/x-pack/apm-server/aggregation/servicetxmetrics/aggregator_test.go +++ /dev/null @@ -1,415 +0,0 @@ -// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one -// or more contributor license agreements. Licensed under the Elastic License 2.0; -// you may not use this file except in compliance with the Elastic License 2.0. - -package servicetxmetrics - -import ( - "context" - "fmt" - "sort" - "sync" - "testing" - "time" - - "github.com/google/go-cmp/cmp" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "google.golang.org/protobuf/testing/protocmp" - "google.golang.org/protobuf/types/known/durationpb" - "google.golang.org/protobuf/types/known/timestamppb" - - "github.com/elastic/apm-data/model/modelpb" - "github.com/elastic/elastic-agent-libs/monitoring" -) - -func TestNewAggregatorConfigInvalid(t *testing.T) { - report := makeErrBatchProcessor(nil) - - type test struct { - config AggregatorConfig - err string - } - - for _, test := range []test{{ - config: AggregatorConfig{}, - err: "BatchProcessor unspecified", - }, { - config: AggregatorConfig{ - BatchProcessor: report, - }, - err: "MaxGroups unspecified or negative", - }, { - config: AggregatorConfig{ - BatchProcessor: report, - MaxGroups: 1, - HDRHistogramSignificantFigures: 1, - }, - err: "Interval unspecified or negative", - }} { - agg, err := NewAggregator(test.config) - require.Error(t, err) - require.Nil(t, agg) - assert.EqualError(t, err, "invalid aggregator config: "+test.err) - } -} - -func TestAggregatorRun(t *testing.T) { - batches := make(chan modelpb.Batch, 3) - config := AggregatorConfig{ - BatchProcessor: makeChanBatchProcessor(batches), - Interval: 1 * time.Millisecond, - RollUpIntervals: []time.Duration{200 * time.Millisecond, time.Second}, - MaxGroups: 1000, - HDRHistogramSignificantFigures: 5, - } - agg, err := NewAggregator(config) - require.NoError(t, err) - - type input struct { - serviceName string - serviceEnvironment string - serviceLanguageName string - agentName string - transactionType string - outcome string - count float64 - } - - inputs := []input{ - {serviceName: "ignored", agentName: "ignored", transactionType: "ignored", count: 0}, // ignored because count is zero - - {serviceName: "backend", serviceLanguageName: "java", agentName: "java", transactionType: "request", outcome: "success", count: 2.1}, - {serviceName: "backend", serviceLanguageName: "java", agentName: "java", transactionType: "request", outcome: "failure", count: 3}, - {serviceName: "backend", serviceLanguageName: "java", agentName: "java", transactionType: "request", outcome: "unknown", count: 1}, - - {serviceName: "backend", serviceLanguageName: "go", agentName: "go", transactionType: "request", outcome: "unknown", count: 1}, - {serviceName: "backend", serviceLanguageName: "go", agentName: "go", transactionType: "background", outcome: "unknown", count: 1}, - - {serviceName: "frontend", serviceLanguageName: "js", agentName: "rum-js", transactionType: "page-load", outcome: "unknown", count: 1}, - {serviceName: "frontend", serviceLanguageName: "js", serviceEnvironment: "staging", agentName: "rum-js", transactionType: "page-load", outcome: "unknown", count: 1}, - } - - var wg sync.WaitGroup - for _, in := range inputs { - wg.Add(1) - go func(in input) { - defer wg.Done() - transaction := makeTransaction( - in.serviceName, in.serviceLanguageName, in.agentName, in.transactionType, - in.outcome, time.Millisecond, in.count, - ) - transaction.Service.Environment = in.serviceEnvironment - - batch := modelpb.Batch{transaction} - err := agg.ProcessBatch(context.Background(), &batch) - require.NoError(t, err) - assert.Equal(t, modelpb.Batch{transaction}, batch) - }(in) - } - wg.Wait() - - // Start the aggregator after processing to ensure metrics are aggregated deterministically. - go agg.Run() - defer agg.Stop(context.Background()) - // Stop the aggregator to ensure all metrics are published. - assert.NoError(t, agg.Stop(context.Background())) - - for _, interval := range append([]time.Duration{config.Interval}, config.RollUpIntervals...) { - batch := expectBatch(t, batches) - metricsets := batchMetricsets(t, batch) - expected := []*modelpb.APMEvent{{ - Metricset: &modelpb.Metricset{ - Name: "service_transaction", DocCount: 6, Interval: fmt.Sprintf("%.0fs", interval.Seconds()), - }, - Service: &modelpb.Service{Name: "backend", Language: &modelpb.Language{Name: "java"}}, - Agent: &modelpb.Agent{Name: "java"}, - Transaction: &modelpb.Transaction{ - Type: "request", - DurationSummary: &modelpb.SummaryMetric{ - Count: 6, - Sum: 6000, // estimated from histogram - }, - DurationHistogram: &modelpb.Histogram{ - Values: []float64{1000}, - Counts: []uint64{6}, - }, - }, - Event: &modelpb.Event{ - SuccessCount: &modelpb.SummaryMetric{ - Count: 5, - Sum: 2, - }, - }, - }, { - Metricset: &modelpb.Metricset{ - Name: "service_transaction", DocCount: 1, Interval: fmt.Sprintf("%.0fs", interval.Seconds()), - }, - Service: &modelpb.Service{Name: "backend", Language: &modelpb.Language{Name: "go"}}, - Agent: &modelpb.Agent{Name: "go"}, - Transaction: &modelpb.Transaction{ - Type: "request", - DurationSummary: &modelpb.SummaryMetric{ - Count: 1, - Sum: 1000, // 1ms in micros - }, - DurationHistogram: &modelpb.Histogram{ - Values: []float64{1000}, - Counts: []uint64{1}, - }, - }, - }, { - Metricset: &modelpb.Metricset{ - Name: "service_transaction", DocCount: 1, Interval: fmt.Sprintf("%.0fs", interval.Seconds()), - }, - Service: &modelpb.Service{Name: "backend", Language: &modelpb.Language{Name: "go"}}, - Agent: &modelpb.Agent{Name: "go"}, - Transaction: &modelpb.Transaction{ - Type: "background", - DurationSummary: &modelpb.SummaryMetric{ - Count: 1, - Sum: 1000, // 1ms in micros - }, - DurationHistogram: &modelpb.Histogram{ - Values: []float64{1000}, - Counts: []uint64{1}, - }, - }, - }, { - Metricset: &modelpb.Metricset{ - Name: "service_transaction", DocCount: 1, Interval: fmt.Sprintf("%.0fs", interval.Seconds()), - }, - Service: &modelpb.Service{Name: "frontend", Language: &modelpb.Language{Name: "js"}}, - Agent: &modelpb.Agent{Name: "rum-js"}, - Transaction: &modelpb.Transaction{ - Type: "page-load", - DurationSummary: &modelpb.SummaryMetric{ - Count: 1, - Sum: 1000, // 1ms in micros - }, - DurationHistogram: &modelpb.Histogram{ - Values: []float64{1000}, - Counts: []uint64{1}, - }, - }, - }, { - Metricset: &modelpb.Metricset{ - Name: "service_transaction", DocCount: 1, Interval: fmt.Sprintf("%.0fs", interval.Seconds()), - }, - Service: &modelpb.Service{Name: "frontend", Environment: "staging", Language: &modelpb.Language{Name: "js"}}, - Agent: &modelpb.Agent{Name: "rum-js"}, - Transaction: &modelpb.Transaction{ - Type: "page-load", - DurationSummary: &modelpb.SummaryMetric{ - Count: 1, - Sum: 1000, // 1ms in micros - }, - DurationHistogram: &modelpb.Histogram{ - Values: []float64{1000}, - Counts: []uint64{1}, - }, - }, - }} - - assert.Equal(t, len(expected), len(metricsets)) - sorter := func(events []*modelpb.APMEvent) func(i, j int) bool { - return func(i, j int) bool { - e1 := events[i] - e2 := events[j] - if e1.Transaction.Type != e2.Transaction.Type { - return e1.Transaction.Type < e2.Transaction.Type - } - - if e1.Agent.Name != e2.Agent.Name { - return e1.Agent.Name < e2.Agent.Name - } - - return e1.Service.Environment < e2.Service.Environment - } - } - sort.Slice(expected, sorter(expected)) - sort.Slice(metricsets, sorter(metricsets)) - assert.Empty(t, cmp.Diff(expected, metricsets, protocmp.Transform())) - } - - select { - case <-batches: - t.Fatal("unexpected publish") - case <-time.After(100 * time.Millisecond): - } -} - -func TestAggregateTimestamp(t *testing.T) { - batches := make(chan modelpb.Batch, 1) - agg, err := NewAggregator(AggregatorConfig{ - BatchProcessor: makeChanBatchProcessor(batches), - Interval: 30 * time.Second, - MaxGroups: 1000, - HDRHistogramSignificantFigures: 1, - }) - require.NoError(t, err) - - t0 := time.Unix(0, 0).UTC() - for _, ts := range []time.Time{t0, t0.Add(15 * time.Second), t0.Add(30 * time.Second)} { - transaction := makeTransaction("service_name", "agent_name", "", "tx_type", "success", 100*time.Millisecond, 1) - transaction.Timestamp = timestamppb.New(ts) - batch := modelpb.Batch{transaction} - err = agg.ProcessBatch(context.Background(), &batch) - require.NoError(t, err) - assert.Empty(t, batchMetricsets(t, batch)) - } - - go agg.Run() - err = agg.Stop(context.Background()) // stop to flush - require.NoError(t, err) - - batch := expectBatch(t, batches) - metricsets := batchMetricsets(t, batch) - require.Len(t, metricsets, 2) - sort.Slice(metricsets, func(i, j int) bool { - return metricsets[i].Timestamp.AsTime().Before(metricsets[j].Timestamp.AsTime()) - }) - assert.Equal(t, t0, metricsets[0].Timestamp.AsTime()) - assert.Equal(t, t0.Add(30*time.Second), metricsets[1].Timestamp.AsTime()) -} - -func TestAggregatorOverflow(t *testing.T) { - maxGrps := 4 - overflowCount := 100 - txnDuration := 100 * time.Millisecond - batches := make(chan modelpb.Batch, 1) - agg, err := NewAggregator(AggregatorConfig{ - BatchProcessor: makeChanBatchProcessor(batches), - Interval: 10 * time.Second, - MaxGroups: maxGrps, - HDRHistogramSignificantFigures: 5, - }) - require.NoError(t, err) - - batch := make(modelpb.Batch, maxGrps+overflowCount) // cause overflow - for i := 0; i < len(batch); i++ { - batch[i] = makeTransaction( - fmt.Sprintf("svc%d", i), "agent", "java", "tx_type", "success", txnDuration, 1, - ) - } - go func(t *testing.T) { - t.Helper() - require.NoError(t, agg.Run()) - }(t) - require.NoError(t, agg.ProcessBatch(context.Background(), &batch)) - require.NoError(t, agg.Stop(context.Background())) - metricsets := batchMetricsets(t, expectBatch(t, batches)) - require.Len(t, metricsets, maxGrps+1) // only one `other` metric should overflow - - // assert monitoring - registry := monitoring.NewRegistry() - monitoring.NewFunc(registry, "servicetxmetrics", agg.CollectMonitoring) - expectedMonitoring := monitoring.MakeFlatSnapshot() - expectedMonitoring.Ints["servicetxmetrics.active_groups"] = int64(maxGrps) - expectedMonitoring.Ints["servicetxmetrics.overflowed.total"] = int64(overflowCount) - assert.Equal(t, expectedMonitoring, monitoring.CollectFlatSnapshot( - registry, monitoring.Full, false, - )) - - var overflowEvent *modelpb.APMEvent - for i := range metricsets { - m := metricsets[i] - if m.Service.Name == "_other" { - if overflowEvent != nil { - require.Fail(t, "only one service should overflow") - } - overflowEvent = m - } - } - assert.Empty(t, cmp.Diff(&modelpb.APMEvent{ - Service: &modelpb.Service{ - Name: "_other", - }, - Transaction: &modelpb.Transaction{ - DurationSummary: &modelpb.SummaryMetric{ - Count: uint64(overflowCount), - Sum: float64(int64(overflowCount) * txnDuration.Microseconds()), - }, - DurationHistogram: &modelpb.Histogram{ - Values: []float64{float64(txnDuration.Microseconds())}, - Counts: []uint64{uint64(overflowCount)}, - }, - }, - Event: &modelpb.Event{ - SuccessCount: &modelpb.SummaryMetric{ - Count: uint64(overflowCount), - Sum: float64(overflowCount), - }, - }, - Metricset: &modelpb.Metricset{ - Name: "service_transaction", - DocCount: uint64(overflowCount), - Interval: "10s", - Samples: []*modelpb.MetricsetSample{ - { - Name: "service_transaction.aggregation.overflow_count", - Value: float64(overflowCount), - }, - }, - }, - }, overflowEvent, - protocmp.Transform(), - protocmp.IgnoreFields(&modelpb.APMEvent{}, "timestamp"), - )) -} - -func makeTransaction( - serviceName, serviceLanguageName, agentName, transactionType, outcome string, - duration time.Duration, count float64, -) *modelpb.APMEvent { - return &modelpb.APMEvent{ - Agent: &modelpb.Agent{Name: agentName}, - Service: &modelpb.Service{Name: serviceName, Language: &modelpb.Language{Name: serviceLanguageName}}, - Event: &modelpb.Event{ - Outcome: outcome, - Duration: durationpb.New(duration), - }, - Transaction: &modelpb.Transaction{ - Name: "transaction_name", - Type: transactionType, - RepresentativeCount: count, - }, - } -} - -func makeErrBatchProcessor(err error) modelpb.BatchProcessor { - return modelpb.ProcessBatchFunc(func(context.Context, *modelpb.Batch) error { return err }) -} - -func makeChanBatchProcessor(ch chan<- modelpb.Batch) modelpb.BatchProcessor { - return modelpb.ProcessBatchFunc(func(ctx context.Context, batch *modelpb.Batch) error { - select { - case <-ctx.Done(): - return ctx.Err() - case ch <- *batch: - return nil - } - }) -} - -func expectBatch(t *testing.T, ch <-chan modelpb.Batch) modelpb.Batch { - t.Helper() - select { - case batch := <-ch: - return batch - case <-time.After(time.Second * 5): - t.Fatal("expected publish") - } - panic("unreachable") -} - -func batchMetricsets(t testing.TB, batch modelpb.Batch) []*modelpb.APMEvent { - var metricsets []*modelpb.APMEvent - for _, event := range batch { - if event.Metricset == nil { - continue - } - metricsets = append(metricsets, event) - } - return metricsets -} diff --git a/x-pack/apm-server/aggregation/spanmetrics/aggregator.go b/x-pack/apm-server/aggregation/spanmetrics/aggregator.go deleted file mode 100644 index 4041a3bc782..00000000000 --- a/x-pack/apm-server/aggregation/spanmetrics/aggregator.go +++ /dev/null @@ -1,548 +0,0 @@ -// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one -// or more contributor license agreements. Licensed under the Elastic License 2.0; -// you may not use this file except in compliance with the Elastic License 2.0. - -package spanmetrics - -import ( - "context" - "encoding/binary" - "math" - "sync" - "sync/atomic" - "time" - - "github.com/axiomhq/hyperloglog" - "github.com/cespare/xxhash/v2" - "github.com/pkg/errors" - "google.golang.org/protobuf/types/known/durationpb" - "google.golang.org/protobuf/types/known/timestamppb" - - "github.com/elastic/apm-data/model/modelpb" - "github.com/elastic/apm-server/internal/logs" - "github.com/elastic/apm-server/x-pack/apm-server/aggregation/baseaggregator" - "github.com/elastic/apm-server/x-pack/apm-server/aggregation/interval" - "github.com/elastic/apm-server/x-pack/apm-server/aggregation/labels" - "github.com/elastic/elastic-agent-libs/logp" - "github.com/elastic/elastic-agent-libs/monitoring" -) - -const ( - metricsetName = "service_destination" - overflowServiceName = "_other" -) - -// AggregatorConfig holds configuration for creating an Aggregator. -type AggregatorConfig struct { - // BatchProcessor is a model.BatchProcessor for asynchronously - // processing metrics documents. - BatchProcessor modelpb.BatchProcessor - - // Logger is the logger for logging metrics aggregation/publishing. - // - // If Logger is nil, a new logger will be constructed. - Logger *logp.Logger - - // RollUpIntervals are additional MetricsInterval for the aggregator to - // compute and publish metrics for. Each additional interval is constrained - // to the same rules as MetricsInterval, and will result in additional - // memory to be allocated. - RollUpIntervals []time.Duration - - // Interval is the interval between publishing of aggregated metrics. - // There may be additional metrics reported at arbitrary times if the - // aggregation groups fill up. - Interval time.Duration - - // MaxGroups is the maximum number of distinct service destination - // group metrics to store within an aggregation period. Once this - // number of groups is reached, any new aggregation keys will be - // aggregated in a dedicated service group identified by `_other`. - // - // Some agents continue to send high cardinality span names, e.g. - // Elasticsearch spans may contain a document ID - // (see https://github.com/elastic/apm/issues/439). To protect against - // this, once MaxGroups becomes 50% full then we will stop aggregating - // on span.name. - MaxGroups int -} - -// Validate validates the aggregator config. -func (config AggregatorConfig) Validate() error { - if config.BatchProcessor == nil { - return errors.New("BatchProcessor unspecified") - } - if config.MaxGroups <= 0 { - return errors.New("MaxGroups unspecified or negative") - } - return nil -} - -// Aggregator aggregates transaction durations, periodically publishing histogram spanMetrics. -type Aggregator struct { - *baseaggregator.Aggregator - config AggregatorConfig - metrics *aggregatorMetrics - - mu sync.RWMutex - // These two metricsBuffer are set to the same size and act as buffers - // for caching and then publishing the metrics as batches. - active, inactive map[time.Duration]*metricsBuffer -} - -type aggregatorMetrics struct { - activeGroups int64 - overflow int64 -} - -// NewAggregator returns a new Aggregator with the given config. -func NewAggregator(config AggregatorConfig) (*Aggregator, error) { - if err := config.Validate(); err != nil { - return nil, errors.Wrap(err, "invalid aggregator config") - } - if config.Logger == nil { - config.Logger = logp.NewLogger(logs.SpanMetrics) - } - aggregator := Aggregator{ - config: config, - metrics: &aggregatorMetrics{}, - active: make(map[time.Duration]*metricsBuffer), - inactive: make(map[time.Duration]*metricsBuffer), - } - base, err := baseaggregator.New(baseaggregator.AggregatorConfig{ - PublishFunc: aggregator.publish, // inject local publish - Logger: config.Logger, - Interval: config.Interval, - RollUpIntervals: config.RollUpIntervals, - }) - if err != nil { - return nil, err - } - aggregator.Aggregator = base - for _, interval := range aggregator.Intervals { - aggregator.active[interval] = newMetricsBuffer(config.MaxGroups) - aggregator.inactive[interval] = newMetricsBuffer(config.MaxGroups) - } - return &aggregator, nil -} - -// CollectMonitoring may be called to collect monitoring metrics from the -// aggregation. It is intended to be used with libbeat/monitoring.NewFunc. -// -// The metrics should be added to the "apm-server.aggregation.spanmetrics" registry. -func (a *Aggregator) CollectMonitoring(_ monitoring.Mode, V monitoring.Visitor) { - V.OnRegistryStart() - defer V.OnRegistryFinished() - - activeGroups := int64(atomic.LoadInt64(&a.metrics.activeGroups)) - overflowed := int64(atomic.LoadInt64(&a.metrics.overflow)) - monitoring.ReportInt(V, "active_groups", activeGroups) - monitoring.ReportInt(V, "overflowed.total", overflowed) -} - -func (a *Aggregator) publish(ctx context.Context, period time.Duration) error { - // We hold a.mu only long enough to swap the spanMetrics. This will - // be blocked by spanMetrics updates, which is OK, as we prefer not - // to block spanMetrics updaters. After the lock is released nothing - // will be accessing a.inactive. - a.mu.Lock() - - // EXPLAIN: We swap active <-> inactive, so that we're only working on the - // inactive property while publish is running. `a.active` is the buffer that - // receives/stores/updates the metricsets, once swapped, we're working on the - // `a.inactive` which we're going to process and publish. - current := a.active[period] - a.active[period], a.inactive[period] = a.inactive[period], current - a.mu.Unlock() - - if current.entries == 0 { - a.config.Logger.Debugf("no span metrics to publish") - return nil - } - - size := current.entries - if current.other != nil { - size++ - } - - intervalStr := interval.FormatDuration(period) - isMetricsPeriod := period == a.config.Interval - batch := make(modelpb.Batch, 0, size) - for hash, entries := range current.m { - for _, entry := range entries { - event := makeMetricset(entry.aggregationKey, entry.spanMetrics) - // Record the metricset interval as metricset.interval. - event.Metricset.Interval = intervalStr - batch = append(batch, event) - } - delete(current.m, hash) - } - if current.other != nil { - overflowCount := current.otherCardinalityEstimator.Estimate() - if isMetricsPeriod { - atomic.AddInt64(&a.metrics.activeGroups, int64(current.entries)) - atomic.AddInt64(&a.metrics.overflow, int64(overflowCount)) - } - entry := current.other - m := makeMetricset(entry.aggregationKey, entry.spanMetrics) - m.Metricset.Interval = intervalStr - m.Metricset.Samples = append(m.Metricset.Samples, &modelpb.MetricsetSample{ - Name: "service_destination.aggregation.overflow_count", - Value: float64(overflowCount), - }) - m.Metricset.DocCount = overflowCount - batch = append(batch, m) - current.other = nil - current.otherCardinalityEstimator = nil - } - current.entries = 0 - a.config.Logger.Debugf("%s interval: publishing %d metricsets", period, len(batch)) - return a.config.BatchProcessor.ProcessBatch(ctx, &batch) -} - -// ProcessBatch aggregates all spans contained in "b". -// It also aggregates transactions where transaction.DroppedSpansStats > 0. -// -// This method is expected to be used immediately prior to publishing -// the events. -func (a *Aggregator) ProcessBatch(ctx context.Context, b *modelpb.Batch) error { - a.mu.RLock() - defer a.mu.RUnlock() - for _, event := range *b { - eventType := event.Type() - if eventType == modelpb.SpanEventType { - a.processSpan(event) - continue - } - - tx := event.Transaction - if eventType == modelpb.TransactionEventType && tx != nil { - for _, dss := range tx.DroppedSpansStats { - a.processDroppedSpanStats(event, dss) - } - // NOTE(marclop) The event.Transaction.DroppedSpansStats is unset - // via the `modelprocessor.DroppedSpansStatsDiscarder` appended just - // before the Elasticsearch publisher. - continue - } - } - return nil -} - -func (a *Aggregator) processSpan(event *modelpb.APMEvent) { - if event.Service.Target == nil && - (event.Span.DestinationService == nil || event.Span.DestinationService.Resource == "") { - return - } - - if event.Span.RepresentativeCount <= 0 { - // RepresentativeCount is zero when the sample rate is unknown. - // We cannot calculate accurate span metrics without the sample - // rate, so we don't calculate any at all in this case. - return - } - - // For composite spans we use the composite sum duration, which is the sum of - // pre-aggregated spans and excludes time gaps that are counted in the reported - // span duration. For non-composite spans we just use the reported span duration. - count := 1 - duration := event.Event.Duration.AsDuration() - if event.Span.Composite != nil { - count = int(event.Span.Composite.Count) - duration = time.Duration(event.Span.Composite.Sum * float64(time.Millisecond)) - } - - var serviceTargetType, serviceTargetName string - if event.Service.Target != nil { - serviceTargetType = event.Service.Target.Type - serviceTargetName = event.Service.Target.Name - } - metrics := spanMetrics{ - count: float64(count) * event.Span.RepresentativeCount, - sum: float64(duration) * event.Span.RepresentativeCount, - } - - var resource string - if event.Span.DestinationService != nil { - resource = event.Span.DestinationService.Resource - } - - for _, interval := range a.Intervals { - key := makeAggregationKey( - event, - event.Event.Outcome, - resource, - serviceTargetType, - serviceTargetName, - event.Span.Name, - interval, - ) - a.active[interval].storeOrUpdate(key, metrics, interval, a.config.Logger) - } -} - -func (a *Aggregator) processDroppedSpanStats(event *modelpb.APMEvent, dss *modelpb.DroppedSpanStats) { - representativeCount := event.Transaction.RepresentativeCount - if representativeCount <= 0 { - // RepresentativeCount is zero when the sample rate is unknown. - // We cannot calculate accurate span metrics without the sample - // rate, so we don't calculate any at all in this case. - return - } - - metrics := spanMetrics{ - count: float64(dss.Duration.Count) * representativeCount, - sum: float64(dss.Duration.Sum.AsDuration()) * representativeCount, - } - for _, interval := range a.Intervals { - key := makeAggregationKey( - event, - dss.Outcome, - dss.DestinationServiceResource, - dss.ServiceTargetType, - dss.ServiceTargetName, - - // BUG(axw) dropped span statistics do not contain span name. - // Capturing the service name requires changes to Elastic APM agents. - "", - - interval, - ) - a.active[interval].storeOrUpdate(key, metrics, interval, a.config.Logger) - } -} - -type metricsBuffer struct { - mu sync.RWMutex - m map[uint64][]*metricsMapEntry - // Number of metricsMapEntry in m. May not equal to len(m) in case of hash collision. - // Does not include overflow bucket. - entries int - - other *metricsMapEntry - otherCardinalityEstimator *hyperloglog.Sketch - - maxSize int -} - -func newMetricsBuffer(maxSize int) *metricsBuffer { - return &metricsBuffer{ - maxSize: maxSize, - m: make(map[uint64][]*metricsMapEntry), - } -} - -type metricsMapEntry struct { - aggregationKey - spanMetrics -} - -func (mb *metricsBuffer) storeOrUpdate( - key aggregationKey, - value spanMetrics, - interval time.Duration, - logger *logp.Logger, -) { - // hash does not use the spanMetrics so it is safe to call concurrently. - hash := key.hash() - - mb.mu.Lock() - defer mb.mu.Unlock() - - find := func(hash uint64, key aggregationKey) (*metricsMapEntry, bool) { - // This function should only be called when caller is holding the lock mb.mu. - // It takes separate hash and key arguments so that hash can be computed - // before acquiring the lock. - entries, ok := mb.m[hash] - if ok { - for _, old := range entries { - if old.aggregationKey.equal(key) { - return old, true - } - } - } - return nil, false - } - - old, ok := find(hash, key) - if !ok { - half := mb.maxSize / 2 - if mb.entries >= half { - // To protect against agents that send high cardinality - // span names, stop aggregating on span.name once the - // number of groups reaches 50% capacity. - key.spanName = "" - hash = key.hash() - old, ok = find(hash, key) - } - if !ok { - if mb.entries >= mb.maxSize { - if mb.other == nil { - logger.Warnf(` -Service aggregation group limit of %d reached, new metric documents will be grouped -under a dedicated bucket identified by service name '%s'.`[1:], mb.maxSize, overflowServiceName) - mb.otherCardinalityEstimator = hyperloglog.New14() - mb.other = &metricsMapEntry{aggregationKey: makeOverflowAggregationKey(key, interval)} - } - old, ok = mb.other, true - mb.otherCardinalityEstimator.InsertHash(hash) - } else { - mb.m[hash] = append(mb.m[hash], &metricsMapEntry{ - aggregationKey: key, - spanMetrics: spanMetrics{count: value.count, sum: value.sum}, - }) - mb.entries++ - return - } - } - } - - old.spanMetrics = spanMetrics{count: value.count + old.count, sum: value.sum + old.sum} -} - -type aggregationKey struct { - labels.AggregatedGlobalLabels - comparable -} - -type comparable struct { - timestamp time.Time - - // origin - serviceName string - serviceEnvironment string - agentName string - - // operation (span) - spanName string - outcome string - - // target - targetType string - targetName string - - // destination - resource string -} - -func (k *aggregationKey) hash() uint64 { - var h xxhash.Digest - var buf [8]byte - binary.LittleEndian.PutUint64(buf[:], uint64(k.timestamp.UnixNano())) - h.Write(buf[:]) - - k.AggregatedGlobalLabels.Write(&h) - h.WriteString(k.serviceName) - h.WriteString(k.serviceEnvironment) - h.WriteString(k.agentName) - h.WriteString(k.spanName) - h.WriteString(k.outcome) - h.WriteString(k.targetType) - h.WriteString(k.targetName) - h.WriteString(k.resource) - return h.Sum64() -} - -func (k *aggregationKey) equal(key aggregationKey) bool { - return k.comparable == key.comparable && - k.AggregatedGlobalLabels.Equals(&key.AggregatedGlobalLabels) -} - -func makeAggregationKey( - event *modelpb.APMEvent, outcome, resource, targetType, targetName, spanName string, interval time.Duration, -) aggregationKey { - key := aggregationKey{ - comparable: comparable{ - - serviceName: event.Service.Name, - serviceEnvironment: event.Service.Environment, - agentName: event.Agent.Name, - - spanName: spanName, - outcome: outcome, - - targetType: targetType, - targetName: targetName, - - resource: resource, - }, - } - if event.Timestamp != nil { - // Group metrics by time interval. - key.comparable.timestamp = event.Timestamp.AsTime().Truncate(interval) - } - key.AggregatedGlobalLabels.Read(event) - return key -} - -func makeOverflowAggregationKey(oldKey aggregationKey, interval time.Duration) aggregationKey { - return aggregationKey{ - comparable: comparable{ - // We are using `time.Now` here to align the overflow aggregation to - // the evaluation time rather than event time. This prevents us from - // cases of bad timestamps when the server receives some events with - // old timestamp and these events overflow causing the indexed event - // to have old timestamp too. - timestamp: time.Now().Truncate(interval), - serviceName: overflowServiceName, - }, - } -} - -type spanMetrics struct { - count float64 - sum float64 -} - -func makeMetricset(key aggregationKey, metrics spanMetrics) *modelpb.APMEvent { - var target *modelpb.ServiceTarget - if key.targetName != "" || key.targetType != "" { - target = &modelpb.ServiceTarget{ - Type: key.targetType, - Name: key.targetName, - } - } - var t *timestamppb.Timestamp - if !key.timestamp.IsZero() { - t = timestamppb.New(key.timestamp) - } - - var agent *modelpb.Agent - if key.agentName != "" { - agent = &modelpb.Agent{Name: key.agentName} - } - - var event *modelpb.Event - if key.outcome != "" { - event = &modelpb.Event{ - Outcome: key.outcome, - } - } - - return &modelpb.APMEvent{ - Timestamp: t, - Agent: agent, - Service: &modelpb.Service{ - Name: key.serviceName, - Environment: key.serviceEnvironment, - Target: target, - }, - Labels: key.Labels, - NumericLabels: key.NumericLabels, - Event: event, - Metricset: &modelpb.Metricset{ - Name: metricsetName, - DocCount: uint64(math.Round(metrics.count)), - }, - Span: &modelpb.Span{ - Name: key.spanName, - DestinationService: &modelpb.DestinationService{ - Resource: key.resource, - ResponseTime: &modelpb.AggregatedDuration{ - Count: uint64(math.Round(metrics.count)), - Sum: durationpb.New(time.Duration(math.Round(metrics.sum))), - }, - }, - }, - } -} diff --git a/x-pack/apm-server/aggregation/spanmetrics/aggregator_test.go b/x-pack/apm-server/aggregation/spanmetrics/aggregator_test.go deleted file mode 100644 index 3462c3369f2..00000000000 --- a/x-pack/apm-server/aggregation/spanmetrics/aggregator_test.go +++ /dev/null @@ -1,861 +0,0 @@ -// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one -// or more contributor license agreements. Licensed under the Elastic License 2.0; -// you may not use this file except in compliance with the Elastic License 2.0. - -package spanmetrics - -import ( - "context" - "fmt" - "sort" - "sync" - "testing" - "time" - - "github.com/google/go-cmp/cmp" - "github.com/google/go-cmp/cmp/cmpopts" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "google.golang.org/protobuf/testing/protocmp" - "google.golang.org/protobuf/types/known/durationpb" - "google.golang.org/protobuf/types/known/timestamppb" - - "github.com/elastic/apm-data/model/modelpb" - "github.com/elastic/elastic-agent-libs/monitoring" -) - -func BenchmarkAggregateSpan(b *testing.B) { - agg, err := NewAggregator(AggregatorConfig{ - BatchProcessor: makeErrBatchProcessor(nil), - Interval: time.Minute, - MaxGroups: 1000, - }) - require.NoError(b, err) - - span := makeSpan("test_service", "agent", "test_destination", "trg_type", "trg_name", "success", time.Second, 1) - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = agg.ProcessBatch(context.Background(), &modelpb.Batch{span}) - } - }) -} - -func TestNewAggregatorConfigInvalid(t *testing.T) { - report := makeErrBatchProcessor(nil) - - type test struct { - config AggregatorConfig - err string - } - - for _, test := range []test{{ - config: AggregatorConfig{}, - err: "BatchProcessor unspecified", - }, { - config: AggregatorConfig{ - BatchProcessor: report, - }, - err: "MaxGroups unspecified or negative", - }, { - config: AggregatorConfig{ - BatchProcessor: report, - MaxGroups: 1, - }, - err: "Interval unspecified or negative", - }} { - agg, err := NewAggregator(test.config) - require.Error(t, err) - require.Nil(t, agg) - assert.EqualError(t, err, "invalid aggregator config: "+test.err) - } -} - -func TestAggregatorRun(t *testing.T) { - type input struct { - serviceName string - agentName string - destination string - targetType string - targetName string - outcome string - count float64 - } - - destinationX := "destination-X" - destinationZ := "destination-Z" - trgTypeX := "trg-type-X" - trgNameX := "trg-name-X" - trgTypeZ := "trg-type-Z" - trgNameZ := "trg-name-Z" - - for _, tt := range []struct { - name string - - inputs []input - - getExpectedEvents func(time.Time, time.Duration) []*modelpb.APMEvent - }{ - { - name: "with destination and service targets", - - inputs: []input{ - {serviceName: "service-A", agentName: "java", destination: destinationZ, targetType: trgTypeZ, targetName: trgNameZ, outcome: "success", count: 2}, - {serviceName: "service-A", agentName: "java", destination: destinationX, targetType: trgTypeX, targetName: trgNameX, outcome: "success", count: 1}, - {serviceName: "service-B", agentName: "python", destination: destinationZ, targetType: trgTypeZ, targetName: trgNameZ, outcome: "success", count: 1}, - {serviceName: "service-A", agentName: "java", destination: destinationZ, targetType: trgTypeZ, targetName: trgNameZ, outcome: "success", count: 1}, - {serviceName: "service-A", agentName: "java", destination: destinationZ, targetType: trgTypeZ, targetName: trgNameZ, outcome: "success", count: 0}, - {serviceName: "service-A", agentName: "java", destination: destinationZ, targetType: trgTypeZ, targetName: trgNameZ, outcome: "failure", count: 1}, - }, - - getExpectedEvents: func(now time.Time, interval time.Duration) []*modelpb.APMEvent { - return []*modelpb.APMEvent{ - { - Timestamp: timestamppb.New(now.Truncate(interval)), - Agent: &modelpb.Agent{Name: "java"}, - Service: &modelpb.Service{ - Name: "service-A", - Target: &modelpb.ServiceTarget{ - Type: trgTypeX, - Name: trgNameX, - }, - }, - Event: &modelpb.Event{Outcome: "success"}, - Metricset: &modelpb.Metricset{ - Name: "service_destination", - Interval: fmt.Sprintf("%.0fs", interval.Seconds()), - DocCount: 100, - }, - Span: &modelpb.Span{ - Name: "service-A:" + destinationX, - DestinationService: &modelpb.DestinationService{ - Resource: destinationX, - ResponseTime: &modelpb.AggregatedDuration{ - Count: 100, - Sum: durationpb.New(10 * time.Second), - }, - }, - }, - Labels: modelpb.Labels{ - "department_name": &modelpb.LabelValue{Value: "apm"}, - "organization": &modelpb.LabelValue{Value: "observability"}, - "company": &modelpb.LabelValue{Value: "elastic"}, - }, - NumericLabels: modelpb.NumericLabels{ - "user_id": &modelpb.NumericLabelValue{Value: 100}, - "cost_center": &modelpb.NumericLabelValue{Value: 10}, - }, - }, { - Timestamp: timestamppb.New(now.Truncate(interval)), - Agent: &modelpb.Agent{Name: "java"}, - Service: &modelpb.Service{ - Name: "service-A", - Target: &modelpb.ServiceTarget{ - Type: trgTypeZ, - Name: trgNameZ, - }, - }, - Event: &modelpb.Event{Outcome: "failure"}, - Metricset: &modelpb.Metricset{ - Name: "service_destination", - Interval: fmt.Sprintf("%.0fs", interval.Seconds()), - DocCount: 100, - }, - Span: &modelpb.Span{ - Name: "service-A:" + destinationZ, - DestinationService: &modelpb.DestinationService{ - Resource: destinationZ, - ResponseTime: &modelpb.AggregatedDuration{ - Count: 100, - Sum: durationpb.New(10 * time.Second), - }, - }, - }, - Labels: modelpb.Labels{ - "department_name": &modelpb.LabelValue{Value: "apm"}, - "organization": &modelpb.LabelValue{Value: "observability"}, - "company": &modelpb.LabelValue{Value: "elastic"}, - }, - NumericLabels: modelpb.NumericLabels{ - "user_id": &modelpb.NumericLabelValue{Value: 100}, - "cost_center": &modelpb.NumericLabelValue{Value: 10}, - }, - }, { - Timestamp: timestamppb.New(now.Truncate(interval)), - Agent: &modelpb.Agent{Name: "java"}, - Service: &modelpb.Service{ - Name: "service-A", - Target: &modelpb.ServiceTarget{ - Type: trgTypeZ, - Name: trgNameZ, - }, - }, - Event: &modelpb.Event{Outcome: "success"}, - Metricset: &modelpb.Metricset{ - Name: "service_destination", - Interval: fmt.Sprintf("%.0fs", interval.Seconds()), - DocCount: 300, - }, - Span: &modelpb.Span{ - Name: "service-A:" + destinationZ, - DestinationService: &modelpb.DestinationService{ - Resource: destinationZ, - ResponseTime: &modelpb.AggregatedDuration{ - Count: 300, - Sum: durationpb.New(30 * time.Second), - }, - }, - }, - Labels: modelpb.Labels{ - "department_name": &modelpb.LabelValue{Value: "apm"}, - "organization": &modelpb.LabelValue{Value: "observability"}, - "company": &modelpb.LabelValue{Value: "elastic"}, - }, - NumericLabels: modelpb.NumericLabels{ - "user_id": &modelpb.NumericLabelValue{Value: 100}, - "cost_center": &modelpb.NumericLabelValue{Value: 10}, - }, - }, { - Timestamp: timestamppb.New(now.Truncate(interval)), - Agent: &modelpb.Agent{Name: "python"}, - Service: &modelpb.Service{ - Name: "service-B", - Target: &modelpb.ServiceTarget{ - Type: trgTypeZ, - Name: trgNameZ, - }, - }, - Event: &modelpb.Event{Outcome: "success"}, - Metricset: &modelpb.Metricset{ - Name: "service_destination", - Interval: fmt.Sprintf("%.0fs", interval.Seconds()), - DocCount: 100, - }, - Span: &modelpb.Span{ - Name: "service-B:" + destinationZ, - DestinationService: &modelpb.DestinationService{ - Resource: destinationZ, - ResponseTime: &modelpb.AggregatedDuration{ - Count: 100, - Sum: durationpb.New(10 * time.Second), - }, - }, - }, - Labels: modelpb.Labels{ - "department_name": &modelpb.LabelValue{Value: "apm"}, - "organization": &modelpb.LabelValue{Value: "observability"}, - "company": &modelpb.LabelValue{Value: "elastic"}, - }, - NumericLabels: modelpb.NumericLabels{ - "user_id": &modelpb.NumericLabelValue{Value: 100}, - "cost_center": &modelpb.NumericLabelValue{Value: 10}, - }, - }, - } - }, - }, - { - name: "with no destination and no service target", - - inputs: []input{ - {serviceName: "service-A", agentName: "java", outcome: "success", count: 1}, - }, - getExpectedEvents: func(now time.Time, interval time.Duration) []*modelpb.APMEvent { - return []*modelpb.APMEvent{} - }, - }, - { - name: "with no destination and a service target", - - inputs: []input{ - {serviceName: "service-A", agentName: "java", targetType: trgTypeZ, targetName: trgNameZ, outcome: "success", count: 1}, - }, - getExpectedEvents: func(now time.Time, interval time.Duration) []*modelpb.APMEvent { - return []*modelpb.APMEvent{ - { - Timestamp: timestamppb.New(now.Truncate(interval)), - Agent: &modelpb.Agent{Name: "java"}, - Service: &modelpb.Service{ - Name: "service-A", - Target: &modelpb.ServiceTarget{ - Type: trgTypeZ, - Name: trgNameZ, - }, - }, - Event: &modelpb.Event{Outcome: "success"}, - Metricset: &modelpb.Metricset{ - Name: "service_destination", - Interval: fmt.Sprintf("%.0fs", interval.Seconds()), - DocCount: 100, - }, - Span: &modelpb.Span{ - Name: "service-A:", - DestinationService: &modelpb.DestinationService{ - ResponseTime: &modelpb.AggregatedDuration{ - Count: 100, - Sum: durationpb.New(10 * time.Second), - }, - }, - }, - Labels: modelpb.Labels{ - "department_name": &modelpb.LabelValue{Value: "apm"}, - "organization": &modelpb.LabelValue{Value: "observability"}, - "company": &modelpb.LabelValue{Value: "elastic"}, - }, - NumericLabels: modelpb.NumericLabels{ - "user_id": &modelpb.NumericLabelValue{Value: 100}, - "cost_center": &modelpb.NumericLabelValue{Value: 10}, - }, - }, - } - }, - }, - { - name: "with a destination and no service target", - - inputs: []input{ - {serviceName: "service-A", agentName: "java", destination: destinationZ, outcome: "success", count: 1}, - }, - getExpectedEvents: func(now time.Time, interval time.Duration) []*modelpb.APMEvent { - return []*modelpb.APMEvent{ - { - Timestamp: timestamppb.New(now.Truncate(interval)), - Agent: &modelpb.Agent{Name: "java"}, - Service: &modelpb.Service{ - Name: "service-A", - }, - Event: &modelpb.Event{Outcome: "success"}, - Metricset: &modelpb.Metricset{ - Name: "service_destination", - Interval: fmt.Sprintf("%.0fs", interval.Seconds()), - DocCount: 100, - }, - Span: &modelpb.Span{ - Name: "service-A:" + destinationZ, - DestinationService: &modelpb.DestinationService{ - Resource: destinationZ, - ResponseTime: &modelpb.AggregatedDuration{ - Count: 100, - Sum: durationpb.New(10 * time.Second), - }, - }, - }, - Labels: modelpb.Labels{ - "department_name": &modelpb.LabelValue{Value: "apm"}, - "organization": &modelpb.LabelValue{Value: "observability"}, - "company": &modelpb.LabelValue{Value: "elastic"}, - }, - NumericLabels: modelpb.NumericLabels{ - "user_id": &modelpb.NumericLabelValue{Value: 100}, - "cost_center": &modelpb.NumericLabelValue{Value: 10}, - }, - }, - } - }, - }, - } { - t.Run(tt.name, func(t *testing.T) { - batches := make(chan modelpb.Batch, 3) - config := AggregatorConfig{ - BatchProcessor: makeChanBatchProcessor(batches), - Interval: 10 * time.Millisecond, - RollUpIntervals: []time.Duration{200 * time.Millisecond, time.Second}, - MaxGroups: 1000, - } - agg, err := NewAggregator(config) - require.NoError(t, err) - - var wg sync.WaitGroup - now := time.Now() - - for _, in := range tt.inputs { - wg.Add(1) - go func(in input) { - defer wg.Done() - span := makeSpan(in.serviceName, in.agentName, in.destination, in.targetType, in.targetName, in.outcome, 100*time.Millisecond, in.count) - span.Timestamp = timestamppb.New(now) - batch := modelpb.Batch{span} - for i := 0; i < 100; i++ { - err := agg.ProcessBatch(context.Background(), &batch) - require.NoError(t, err) - assert.Equal(t, modelpb.Batch{span}, batch) - } - }(in) - } - wg.Wait() - - // Start the aggregator after processing to ensure metrics are aggregated deterministically. - go agg.Run() - defer agg.Stop(context.Background()) - // Stop the aggregator to ensure all metrics are published. - assert.NoError(t, agg.Stop(context.Background())) - - for _, interval := range append([]time.Duration{config.Interval}, config.RollUpIntervals...) { - expectedEvents := tt.getExpectedEvents(now, interval) - - if len(expectedEvents) == 0 { - select { - case <-batches: - assert.Fail(t, "unexpected publish") - case <-time.After(100 * time.Millisecond): - } - } else { - metricsets := batchMetricsets(t, expectBatch(t, batches)) - assert.Empty(t, cmp.Diff(expectedEvents, metricsets, - protocmp.Transform(), - cmpopts.SortSlices(func(x, y *modelpb.APMEvent) bool { - if x.Span.Name != y.Span.Name { - return x.Span.Name < y.Span.Name - } - if x.Event.Outcome != y.Event.Outcome { - return x.Event.Outcome < y.Event.Outcome - } - return x.Agent.Name < y.Agent.Name - }), - )) - } - } - - select { - case <-batches: - t.Fatal("unexpected publish") - case <-time.After(100 * time.Millisecond): - } - }) - } - -} - -func TestAggregateCompositeSpan(t *testing.T) { - batches := make(chan modelpb.Batch, 1) - agg, err := NewAggregator(AggregatorConfig{ - BatchProcessor: makeChanBatchProcessor(batches), - Interval: 10 * time.Millisecond, - MaxGroups: 1000, - }) - require.NoError(t, err) - - span := makeSpan("service-A", "java", "final_destination", "trg_type", "trg_name", "success", time.Second, 2) - span.Span.Composite = &modelpb.Composite{Count: 25, Sum: 700 /* milliseconds */} - err = agg.ProcessBatch(context.Background(), &modelpb.Batch{span}) - require.NoError(t, err) - - // Start the aggregator after processing to ensure metrics are aggregated deterministically. - go agg.Run() - defer agg.Stop(context.Background()) - - batch := expectBatch(t, batches) - metricsets := batchMetricsets(t, batch) - - assert.Empty(t, cmp.Diff([]*modelpb.APMEvent{{ - Agent: &modelpb.Agent{Name: "java"}, - Service: &modelpb.Service{ - Name: "service-A", - Target: &modelpb.ServiceTarget{ - Type: "trg_type", - Name: "trg_name", - }, - }, - Event: &modelpb.Event{Outcome: "success"}, - Metricset: &modelpb.Metricset{Name: "service_destination", Interval: "0s", DocCount: 50}, - Span: &modelpb.Span{ - Name: "service-A:final_destination", - DestinationService: &modelpb.DestinationService{ - Resource: "final_destination", - ResponseTime: &modelpb.AggregatedDuration{ - Count: 50, - Sum: durationpb.New(1400 * time.Millisecond), - }, - }, - }, - Labels: modelpb.Labels{ - "department_name": &modelpb.LabelValue{Value: "apm"}, - "organization": &modelpb.LabelValue{Value: "observability"}, - "company": &modelpb.LabelValue{Value: "elastic"}, - }, - NumericLabels: modelpb.NumericLabels{ - "user_id": &modelpb.NumericLabelValue{Value: 100}, - "cost_center": &modelpb.NumericLabelValue{Value: 10}, - }, - }}, metricsets, protocmp.Transform())) -} - -func TestAggregateTransactionDroppedSpansStats(t *testing.T) { - batches := make(chan modelpb.Batch, 1) - agg, err := NewAggregator(AggregatorConfig{ - BatchProcessor: makeChanBatchProcessor(batches), - Interval: 10 * time.Millisecond, - MaxGroups: 1000, - }) - require.NoError(t, err) - - txWithoutServiceTarget := modelpb.APMEvent{ - Agent: &modelpb.Agent{Name: "go"}, - Service: &modelpb.Service{ - Name: "go-service", - }, - Event: &modelpb.Event{ - Outcome: "success", - Duration: durationpb.New(10 * time.Second), - }, - Transaction: &modelpb.Transaction{ - Type: "transaction_type", - RepresentativeCount: 2, - DroppedSpansStats: []*modelpb.DroppedSpanStats{ - { - DestinationServiceResource: "https://elasticsearch:9200", - Outcome: "success", - Duration: &modelpb.AggregatedDuration{ - Count: 10, - Sum: durationpb.New(1500 * time.Microsecond), - }, - }, - { - DestinationServiceResource: "mysql://mysql:3306", - Outcome: "unknown", - Duration: &modelpb.AggregatedDuration{ - Count: 2, - Sum: durationpb.New(3000 * time.Microsecond), - }, - }, - }, - }, - } - - txWithServiceTarget := modelpb.APMEvent{ - Agent: &modelpb.Agent{Name: "go"}, - Service: &modelpb.Service{ - Name: "go-service", - }, - Event: &modelpb.Event{ - Outcome: "success", - Duration: durationpb.New(10 * time.Second), - }, - Transaction: &modelpb.Transaction{ - Type: "transaction_type", - RepresentativeCount: 1, - DroppedSpansStats: []*modelpb.DroppedSpanStats{ - { - DestinationServiceResource: "postgres/testdb", - ServiceTargetType: "postgres", - ServiceTargetName: "testdb", - Outcome: "success", - Duration: &modelpb.AggregatedDuration{ - Count: 10, - Sum: durationpb.New(1500 * time.Microsecond), - }, - }, - }, - }, - } - - txWithNoRepresentativeCount := modelpb.APMEvent{ - Transaction: &modelpb.Transaction{ - Type: "transaction_type", - RepresentativeCount: 0, - DroppedSpansStats: make([]*modelpb.DroppedSpanStats, 1), - }, - } - err = agg.ProcessBatch( - context.Background(), - &modelpb.Batch{ - &txWithoutServiceTarget, - &txWithServiceTarget, - &txWithNoRepresentativeCount, - }) - require.NoError(t, err) - - // Start the aggregator after processing to ensure metrics are aggregated deterministically. - go agg.Run() - defer agg.Stop(context.Background()) - - batch := expectBatch(t, batches) - metricsets := batchMetricsets(t, batch) - - assert.Empty(t, cmp.Diff([]*modelpb.APMEvent{ - { - Agent: &modelpb.Agent{Name: "go"}, - Service: &modelpb.Service{ - Name: "go-service", - }, - Event: &modelpb.Event{Outcome: "success"}, - Metricset: &modelpb.Metricset{Name: "service_destination", Interval: "0s", DocCount: 20}, - Span: &modelpb.Span{ - DestinationService: &modelpb.DestinationService{ - Resource: "https://elasticsearch:9200", - ResponseTime: &modelpb.AggregatedDuration{ - Count: 20, - Sum: durationpb.New(3000 * time.Microsecond), - }, - }, - }, - }, - { - Agent: &modelpb.Agent{Name: "go"}, - Service: &modelpb.Service{ - Name: "go-service", - Target: &modelpb.ServiceTarget{ - Type: "postgres", - Name: "testdb", - }, - }, - Event: &modelpb.Event{Outcome: "success"}, - Metricset: &modelpb.Metricset{Name: "service_destination", Interval: "0s", DocCount: 10}, - Span: &modelpb.Span{ - DestinationService: &modelpb.DestinationService{ - Resource: "postgres/testdb", - ResponseTime: &modelpb.AggregatedDuration{ - Count: 10, - Sum: durationpb.New(1500 * time.Microsecond), - }, - }, - }, - }, - { - Agent: &modelpb.Agent{Name: "go"}, - Service: &modelpb.Service{ - Name: "go-service", - }, - Event: &modelpb.Event{Outcome: "unknown"}, - Metricset: &modelpb.Metricset{Name: "service_destination", Interval: "0s", DocCount: 4}, - Span: &modelpb.Span{ - DestinationService: &modelpb.DestinationService{ - Resource: "mysql://mysql:3306", - ResponseTime: &modelpb.AggregatedDuration{ - Count: 4, - Sum: durationpb.New(6000 * time.Microsecond), - }, - }, - }, - }, - }, metricsets, - protocmp.Transform(), - cmpopts.SortSlices(func(e1 *modelpb.APMEvent, e2 *modelpb.APMEvent) bool { - return e1.Span.DestinationService.Resource < e2.Span.DestinationService.Resource - }))) -} - -func TestAggregateHalfCapacityNoSpanName(t *testing.T) { - batches := make(chan modelpb.Batch, 1) - agg, err := NewAggregator(AggregatorConfig{ - BatchProcessor: makeChanBatchProcessor(batches), - Interval: 10 * time.Millisecond, - MaxGroups: 4, - }) - require.NoError(t, err) - - err = agg.ProcessBatch( - context.Background(), - &modelpb.Batch{ - makeSpan("service", "agent", "dest1", "target_type", "target1", "success", 100*time.Millisecond, 1), - makeSpan("service", "agent", "dest2", "target_type", "target2", "success", 100*time.Millisecond, 1), - makeSpan("service", "agent", "dest3", "target_type", "target3", "success", 100*time.Millisecond, 1), - makeSpan("service", "agent", "dest4", "target_type", "target4", "success", 100*time.Millisecond, 1), - }, - ) - require.NoError(t, err) - - // Start the aggregator after processing to ensure metrics are aggregated deterministically. - go agg.Run() - defer agg.Stop(context.Background()) - - batch := expectBatch(t, batches) - metricsets := batchMetricsets(t, batch) - - actualDestinationSpanNames := make(map[string]string) - for _, ms := range metricsets { - actualDestinationSpanNames[ms.Span.DestinationService.Resource] = ms.Span.Name - } - assert.Equal(t, map[string]string{ - "dest1": "service:dest1", - "dest2": "service:dest2", - // After 50% capacity (4 buckets with our configuration) is reached, - // the remaining metrics are aggregated without span.name. - "dest3": "", - "dest4": "", - }, actualDestinationSpanNames) -} - -func TestAggregateTimestamp(t *testing.T) { - batches := make(chan modelpb.Batch, 1) - agg, err := NewAggregator(AggregatorConfig{ - BatchProcessor: makeChanBatchProcessor(batches), - Interval: 30 * time.Second, - MaxGroups: 1000, - }) - require.NoError(t, err) - - t0 := time.Unix(0, 0).UTC() - for _, ts := range []time.Time{t0, t0.Add(15 * time.Second), t0.Add(30 * time.Second)} { - span := makeSpan("service_name", "agent_name", "destination", "trg_type", "trg_name", "success", 100*time.Millisecond, 1) - span.Timestamp = timestamppb.New(ts) - batch := modelpb.Batch{span} - err = agg.ProcessBatch(context.Background(), &batch) - require.NoError(t, err) - assert.Empty(t, batchMetricsets(t, batch)) - } - - go agg.Run() - err = agg.Stop(context.Background()) // stop to flush - require.NoError(t, err) - - batch := expectBatch(t, batches) - metricsets := batchMetricsets(t, batch) - require.Len(t, metricsets, 2) - sort.Slice(metricsets, func(i, j int) bool { - return metricsets[i].Timestamp.AsTime().Before(metricsets[j].Timestamp.AsTime()) - }) - assert.Equal(t, t0, metricsets[0].Timestamp.AsTime()) - assert.Equal(t, t0.Add(30*time.Second), metricsets[1].Timestamp.AsTime()) -} - -func TestAggregatorOverflow(t *testing.T) { - maxGrps := 4 - overflowCount := 100 - duration := 100 * time.Millisecond - batches := make(chan modelpb.Batch, 1) - agg, err := NewAggregator(AggregatorConfig{ - BatchProcessor: makeChanBatchProcessor(batches), - Interval: 10 * time.Second, - MaxGroups: maxGrps, - }) - require.NoError(t, err) - - batch := make(modelpb.Batch, maxGrps+overflowCount) // cause overflow - for i := 0; i < len(batch); i++ { - batch[i] = makeSpan("service", "agent", fmt.Sprintf("destination%d", i), - fmt.Sprintf("trg_type_%d", i), fmt.Sprintf("trg_name_%d", i), "success", duration, 1) - } - go func(t *testing.T) { - t.Helper() - require.NoError(t, agg.Run()) - }(t) - require.NoError(t, agg.ProcessBatch(context.Background(), &batch)) - require.NoError(t, agg.Stop(context.Background())) - metricsets := batchMetricsets(t, expectBatch(t, batches)) - require.Len(t, metricsets, maxGrps+1) // only one `other` metric should overflow - - // assert monitoring - registry := monitoring.NewRegistry() - monitoring.NewFunc(registry, "spanmetrics", agg.CollectMonitoring) - expectedMonitoring := monitoring.MakeFlatSnapshot() - expectedMonitoring.Ints["spanmetrics.active_groups"] = int64(maxGrps) - expectedMonitoring.Ints["spanmetrics.overflowed.total"] = int64(overflowCount) - - var overflowEvent *modelpb.APMEvent - for i := range metricsets { - m := metricsets[i] - if m.Service.Name == "_other" { - if overflowEvent != nil { - require.Fail(t, "only one service should overflow") - } - overflowEvent = m - } - } - assert.Empty(t, cmp.Diff(&modelpb.APMEvent{ - Service: &modelpb.Service{ - Name: "_other", - }, - Metricset: &modelpb.Metricset{ - Name: "service_destination", - DocCount: uint64(overflowCount), - Interval: "10s", - Samples: []*modelpb.MetricsetSample{ - { - Name: "service_destination.aggregation.overflow_count", - Value: float64(overflowCount), - }, - }, - }, - Span: &modelpb.Span{ - Name: "", - DestinationService: &modelpb.DestinationService{ - Resource: "", - ResponseTime: &modelpb.AggregatedDuration{ - Count: uint64(overflowCount), - Sum: durationpb.New(time.Duration(duration.Nanoseconds() * int64(overflowCount))), - }, - }, - }, - }, overflowEvent, - protocmp.Transform(), - protocmp.IgnoreMessages(×tamppb.Timestamp{}), - )) -} - -func makeSpan( - serviceName, agentName, destinationServiceResource, targetType, targetName, outcome string, - duration time.Duration, - count float64, -) *modelpb.APMEvent { - event := modelpb.APMEvent{ - Agent: &modelpb.Agent{Name: agentName}, - Service: &modelpb.Service{Name: serviceName}, - Event: &modelpb.Event{ - Outcome: outcome, - Duration: durationpb.New(duration), - }, - Span: &modelpb.Span{ - Type: "span_type", - Name: serviceName + ":" + destinationServiceResource, - RepresentativeCount: count, - }, - Labels: modelpb.Labels{ - "department_name": &modelpb.LabelValue{Global: true, Value: "apm"}, - "organization": &modelpb.LabelValue{Global: true, Value: "observability"}, - "company": &modelpb.LabelValue{Global: true, Value: "elastic"}, - }, - NumericLabels: modelpb.NumericLabels{ - "user_id": &modelpb.NumericLabelValue{Global: true, Value: 100}, - "cost_center": &modelpb.NumericLabelValue{Global: true, Value: 10}, - }, - } - if destinationServiceResource != "" { - event.Span.DestinationService = &modelpb.DestinationService{ - Resource: destinationServiceResource, - } - } - if targetType != "" { - event.Service.Target = &modelpb.ServiceTarget{ - Type: targetType, - Name: targetName, - } - } - return &event -} - -func makeErrBatchProcessor(err error) modelpb.BatchProcessor { - return modelpb.ProcessBatchFunc(func(context.Context, *modelpb.Batch) error { return err }) -} - -func makeChanBatchProcessor(ch chan<- modelpb.Batch) modelpb.BatchProcessor { - return modelpb.ProcessBatchFunc(func(ctx context.Context, batch *modelpb.Batch) error { - select { - case <-ctx.Done(): - return ctx.Err() - case ch <- *batch: - return nil - } - }) -} - -func expectBatch(t *testing.T, ch <-chan modelpb.Batch) modelpb.Batch { - t.Helper() - select { - case batch := <-ch: - return batch - case <-time.After(time.Second * 5): - t.Fatal("expected publish") - } - panic("unreachable") -} - -func batchMetricsets(t testing.TB, batch modelpb.Batch) []*modelpb.APMEvent { - var metricsets []*modelpb.APMEvent - for _, event := range batch { - if event.Metricset == nil { - continue - } - metricsets = append(metricsets, event) - } - return metricsets -} diff --git a/x-pack/apm-server/aggregation/txmetrics/aggregator.go b/x-pack/apm-server/aggregation/txmetrics/aggregator.go deleted file mode 100644 index f704a11cf0b..00000000000 --- a/x-pack/apm-server/aggregation/txmetrics/aggregator.go +++ /dev/null @@ -1,989 +0,0 @@ -// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one -// or more contributor license agreements. Licensed under the Elastic License 2.0; -// you may not use this file except in compliance with the Elastic License 2.0. - -package txmetrics - -import ( - "context" - "encoding/binary" - "math" - "sync" - "time" - - "github.com/axiomhq/hyperloglog" - "github.com/cespare/xxhash/v2" - "github.com/pkg/errors" - "google.golang.org/protobuf/types/known/timestamppb" - - "github.com/elastic/elastic-agent-libs/logp" - "github.com/elastic/elastic-agent-libs/monitoring" - "github.com/elastic/go-hdrhistogram" - - "github.com/elastic/apm-data/model/modelpb" - "github.com/elastic/apm-server/internal/logs" - "github.com/elastic/apm-server/x-pack/apm-server/aggregation/baseaggregator" - "github.com/elastic/apm-server/x-pack/apm-server/aggregation/interval" - "github.com/elastic/apm-server/x-pack/apm-server/aggregation/labels" -) - -const ( - minDuration time.Duration = 0 - maxDuration time.Duration = time.Hour - - // We scale transaction counts in the histogram, which only permits storing - // integer counts, to allow for fractional transactions due to sampling. - // - // e.g. if the sampling rate is 0.4, then each sampled transaction has a - // representative count of 2.5 (1/0.4). If we receive two such transactions - // we will record a count of 5000 (2 * 2.5 * histogramCountScale). When we - // publish metrics, we will scale down to 5 (5000 / histogramCountScale). - histogramCountScale = 1000 - - metricsetName = "transaction" - - // overflowBucketName is an identifier to denote overflow buckets - overflowBucketName = "_other" - - // overflowLoggerRateLimit is the maximum frequency at which overflow logs - // are logged. - overflowLoggerRateLimit = time.Minute -) - -// Aggregator aggregates transaction durations, periodically publishing histogram metrics. -type Aggregator struct { - *baseaggregator.Aggregator - config AggregatorConfig - metrics *aggregatorMetrics - - overflowLogger *logp.Logger - - mu sync.RWMutex - active, inactive map[time.Duration]*metrics - - histogramPool sync.Pool -} - -type aggregatorMetrics struct { - mu sync.RWMutex - activeGroups int64 - txnGroupsOverflow int64 - perSvcTxnGroupsOverflow int64 - servicesOverflow int64 -} - -// AggregatorConfig holds configuration for creating an Aggregator. -type AggregatorConfig struct { - // BatchProcessor is a model.BatchProcessor for asynchronously processing metrics documents. - BatchProcessor modelpb.BatchProcessor - - // Logger is the logger for logging histogram aggregation/publishing. - // - // If Logger is nil, a new logger will be constructed. - Logger *logp.Logger - - // MaxTransactionGroups is the maximum number of distinct transaction - // group metrics to store within an aggregation period. Once this number - // of groups has been reached, any new aggregation keys will be aggregated - // in a dedicated service group identified by `_other`. - MaxTransactionGroups int - - // MaxTransactionGroupsPerService is the maximum number of distinct - // transaction group per service to store within an aggregation period. - // - // When the limit on per service transaction group is reached the new - // transactions will be aggregated in a dedicated transaction group - // per service identified by `_other`. - MaxTransactionGroupsPerService int - - // MaxServices is the maximum number of distinct services that the - // transaction groups will aggregate for. - // - // When the limit on service count is reached a new service, identified - // by name `_other` will be used to aggregate all transactions within a - // single bucket. - MaxServices int - - // MetricsInterval is the interval between publishing of aggregated - // metrics. There may be additional metrics reported at arbitrary - // times if the aggregation groups fill up. - MetricsInterval time.Duration - - // RollUpIntervals are additional MetricsInterval for the aggregator to - // compute and publish metrics for. Each additional interval is constrained - // to the same rules as MetricsInterval, and will result in additional - // memory to be allocated. - RollUpIntervals []time.Duration - - // HDRHistogramSignificantFigures is the number of significant figures - // to maintain in the HDR Histograms. HDRHistogramSignificantFigures - // must be in the range [1,5]. - HDRHistogramSignificantFigures int -} - -// Validate validates the aggregator config. -func (config AggregatorConfig) Validate() error { - if config.BatchProcessor == nil { - return errors.New("BatchProcessor unspecified") - } - if config.MaxTransactionGroups <= 0 { - return errors.New("MaxTransactionGroups unspecified or negative") - } - if config.MaxTransactionGroupsPerService <= 0 { - return errors.New("MaxTransactionGroupsPerService unspecified or negative") - } - if config.MaxServices <= 0 { - return errors.New("MaxServices unspecified or negative") - } - if n := config.HDRHistogramSignificantFigures; n < 1 || n > 5 { - return errors.Errorf("HDRHistogramSignificantFigures (%d) outside range [1,5]", n) - } - return nil -} - -// NewAggregator returns a new Aggregator with the given config. -func NewAggregator(config AggregatorConfig) (*Aggregator, error) { - if err := config.Validate(); err != nil { - return nil, errors.Wrap(err, "invalid aggregator config") - } - if config.Logger == nil { - config.Logger = logp.NewLogger(logs.TransactionMetrics) - } - aggregator := Aggregator{ - config: config, - metrics: &aggregatorMetrics{}, - overflowLogger: config.Logger.WithOptions(logs.WithRateLimit(overflowLoggerRateLimit)), - active: make(map[time.Duration]*metrics), - inactive: make(map[time.Duration]*metrics), - histogramPool: sync.Pool{New: func() interface{} { - return hdrhistogram.New( - minDuration.Microseconds(), - maxDuration.Microseconds(), - config.HDRHistogramSignificantFigures, - ) - }}, - } - base, err := baseaggregator.New(baseaggregator.AggregatorConfig{ - PublishFunc: aggregator.publish, // inject local publish - Logger: config.Logger, - Interval: config.MetricsInterval, - RollUpIntervals: config.RollUpIntervals, - }) - if err != nil { - return nil, err - } - aggregator.Aggregator = base - for _, interval := range aggregator.Intervals { - aggregator.active[interval] = newMetrics(config.MaxTransactionGroups, config.MaxServices) - aggregator.inactive[interval] = newMetrics(config.MaxTransactionGroups, config.MaxServices) - } - return &aggregator, nil -} - -// CollectMonitoring may be called to collect monitoring metrics from the -// aggregation. It is intended to be used with libbeat/monitoring.NewFunc. -// -// The metrics should be added to the "apm-server.aggregation.txmetrics" registry. -func (a *Aggregator) CollectMonitoring(_ monitoring.Mode, V monitoring.Visitor) { - V.OnRegistryStart() - defer V.OnRegistryFinished() - - metrics := a.metrics - - a.metrics.mu.RLock() - defer a.metrics.mu.RUnlock() - - totalOverflow := metrics.servicesOverflow + metrics.perSvcTxnGroupsOverflow + metrics.txnGroupsOverflow - monitoring.ReportInt(V, "active_groups", metrics.activeGroups) - monitoring.ReportNamespace(V, "overflowed", func() { - monitoring.ReportInt(V, "services", metrics.servicesOverflow) - monitoring.ReportInt(V, "per_service_txn_groups", metrics.perSvcTxnGroupsOverflow) - monitoring.ReportInt(V, "txn_groups", metrics.txnGroupsOverflow) - monitoring.ReportInt(V, "total", totalOverflow) - }) -} - -func (a *Aggregator) publish(ctx context.Context, period time.Duration) error { - // We hold a.mu only long enough to swap the metrics. This will - // be blocked by metrics updates, which is OK, as we prefer not - // to block metrics updaters. After the lock is released nothing - // will be accessing a.inactive. - a.mu.Lock() - current := a.active[period] - a.active[period], a.inactive[period] = a.inactive[period], current - a.mu.Unlock() - - if current.entries == 0 { - // The condition will hold even for overflow since an overflow cannot - // happen without adding some transaction groups. - a.config.Logger.Debugf("no metrics to publish") - return nil - } - - var servicesOverflow, perSvcTxnGroupsOverflow, txnGroupsOverflow int64 - isMetricsPeriod := period == a.config.MetricsInterval - intervalStr := interval.FormatDuration(period) - totalActiveGroups := current.entries + current.overflowedEntries - batch := make(modelpb.Batch, 0, totalActiveGroups) - for svc, svcEntry := range current.m { - for _, entries := range svcEntry.m { - for _, entry := range entries { - // Record the metricset interval as metricset.interval. - event := makeMetricset(entry.transactionAggregationKey, entry.transactionMetrics, intervalStr) - batch = append(batch, event) - entry.reset(&a.histogramPool) - } - } - if svcEntry.other != nil { - overflowCount := int64(svcEntry.otherCardinalityEstimator.Estimate()) - if isMetricsPeriod { - if svc == overflowBucketName { - servicesOverflow += overflowCount - } else if svcEntry.entries >= a.config.MaxTransactionGroupsPerService { - perSvcTxnGroupsOverflow += overflowCount - } else { - txnGroupsOverflow += overflowCount - } - } - entry := svcEntry.other - // Record the metricset interval as metricset.interval. - m := makeMetricset(entry.transactionAggregationKey, entry.transactionMetrics, intervalStr) - m.Metricset.Samples = append(m.Metricset.Samples, &modelpb.MetricsetSample{ - Name: "transaction.aggregation.overflow_count", - Value: float64(overflowCount), - }) - batch = append(batch, m) - entry.reset(&a.histogramPool) - } - svcEntry.reset() - } - if isMetricsPeriod { - a.metrics.mu.Lock() - a.metrics.activeGroups += int64(totalActiveGroups) - a.metrics.servicesOverflow += servicesOverflow - a.metrics.perSvcTxnGroupsOverflow += perSvcTxnGroupsOverflow - a.metrics.txnGroupsOverflow += txnGroupsOverflow - a.metrics.mu.Unlock() - } - current.reset() - - a.config.Logger.Debugf("%s interval: publishing %d metricsets", period, len(batch)) - return a.config.BatchProcessor.ProcessBatch(ctx, &batch) -} - -// ProcessBatch aggregates all transactions contained in "b". On overflow -// the metrics are aggregated into `_other` buckets to contain cardinality. -func (a *Aggregator) ProcessBatch(ctx context.Context, b *modelpb.Batch) error { - for _, event := range *b { - if event.Type() != modelpb.TransactionEventType { - continue - } - a.AggregateTransaction(event) - } - return nil -} - -// AggregateTransaction aggregates transaction metrics. -// -// If the transaction cannot be aggregated due to the maximum number -// of transaction groups being exceeded, then a metricset APMEvent will -// be returned which should be published immediately, along with the -// transaction. Otherwise, the returned event will be the zero value. -// -// To contain the cardinality of the aggregated metrics the following -// limits are considered: -// -// - MaxTransactionGroupsPerService: Limits the maximum number of -// transactions that a specific service can produce in one aggregation -// interval. Once the limit is breached the new transactions are -// aggregated under a dedicated bucket with `transaction.name` as `_other`. -// - MaxTransactionGroups: Limits the maximum number of transaction groups -// that the aggregator can produce in one aggregation interval. Once the -// limit is breached the new transactions are aggregated in the `_other` -// transaction bucket of their corresponding services. -// - MaxServices: Limits the maximum number of services that the aggregator -// can aggregate over. Once this limit is breached the metrics will be -// aggregated in the `_other` transaction bucket of a dedicated service -// with `service.name` as `_other`. -func (a *Aggregator) AggregateTransaction(event *modelpb.APMEvent) { - count := event.Transaction.RepresentativeCount - if count <= 0 { - return - } - for _, interval := range a.Intervals { - key := makeTransactionAggregationKey(event, interval) - if err := a.updateTransactionMetrics(key, count, event.GetEvent().GetDuration().AsDuration(), interval); err != nil { - a.config.Logger.Errorf("failed to aggregate transaction: %w", err) - } - } -} - -func (a *Aggregator) updateTransactionMetrics(key transactionAggregationKey, count float64, duration, interval time.Duration) error { - // Ensure duration is within HDR histogram's bounds - if duration < minDuration { - duration = minDuration - } else if duration > maxDuration { - duration = maxDuration - } - - hash := key.hash() - // Get a read lock over the aggregator to ensure that the active metrics is not - // published when updater is processing. - a.mu.RLock() - defer a.mu.RUnlock() - m := a.active[interval] - - // Get a read lock over the metrics to search for a pre-existing transaction group - // entry. - m.mu.RLock() - _, entry, offset := m.searchMetricsEntry(hash, key, 0) - m.mu.RUnlock() - if entry != nil { - entry.recordDuration(duration, count) - return nil - } - - // If cannot find a pre-existing transaction group then acquire a write lock in - // order to create a new transaction group. To protect against race conditions due - // to manual upgrade of lock search for the transaction group again. - var svc *svcMetricsMapEntry - m.mu.Lock() - defer m.mu.Unlock() - svc, entry, _ = m.searchMetricsEntry(hash, key, offset) - if entry != nil { - entry.recordDuration(duration, count) - return nil - } - - // If all attempts to search for existing transaction group have failed then a new - // transaction group is created as per the following criteria: - // 1. If the service exists: - // 1.a. If the number of transaction groups for the service is less than the - // limit for max per service transaction group, then create a new group. - // 1.b. If the max per service transaction group limit is breached then record - // the metrics in the transaction group overflow bucket for the service. - // 2. If the service doesn't exist: - // 2.a. If the number of services is less than max services, then create a new - // service and record data as per criteria 1. - // 2.b. If the max_services limit is breached, then record the metrics in the - // service overflow bucket. - var err error - var svcOverflow, perSvcTxnOverflow, txnOverflow bool - if svc == nil { - // consider service overflow only if a new service needs to be created. - svcOverflow = m.services >= a.config.MaxServices - svc, err = m.newServiceEntry(key.serviceName, svcOverflow) - if err != nil { - return err - } - } - perSvcTxnOverflow = svc.entries >= a.config.MaxTransactionGroupsPerService - txnOverflow = m.entries >= a.config.MaxTransactionGroups - - // If metrics are overflowing then make sure to update the cardinality estimator - // as well as overwrite the key with the overflow key. - overflow := svcOverflow || perSvcTxnOverflow || txnOverflow - if overflow { - // For `_other` service we only account for `_other` transaction bucket. - key = makeOverflowAggregationKey(key, svcOverflow, interval) - a.logOverflow(key.serviceName, interval, svcOverflow, perSvcTxnOverflow, txnOverflow) - } - entry, err = m.newMetricsEntry(svc, hash, key, &a.histogramPool, overflow) - if err != nil { - return err - } - entry.recordDuration(duration, count) - return nil -} - -func (a *Aggregator) logOverflow(svcName string, interval time.Duration, svcOverflow, perSvcTxnOverflow, txnOverflow bool) { - if svcOverflow { - a.overflowLogger.Warnf(` -%s Service limit of %d reached, new metric documents will be grouped under a dedicated -overflow bucket identified by service name '%s'.`[1:], - interval.String(), - a.config.MaxServices, - overflowBucketName, - ) - } - if perSvcTxnOverflow { - a.overflowLogger.Warnf(` -%s Transaction group limit of %d reached for service %s, new metric documents will be grouped -under a dedicated bucket identified by transaction name '%s'. This is typically -caused by ineffective transaction grouping, e.g. by creating many unique transaction -names. -If you are using an agent with 'use_path_as_transaction_name' enabled, it may cause -high cardinality. If your agent supports the 'transaction_name_groups' option, setting -that configuration option appropriately, may lead to better results.`[1:], - interval.String(), - a.config.MaxTransactionGroupsPerService, - svcName, - overflowBucketName, - ) - } - a.overflowLogger.Warnf(` -%s Overall transaction group limit of %d reached, new metric documents will be grouped -under a dedicated bucket identified by transaction name '%s'. This is typically -caused by ineffective transaction grouping, e.g. by creating many unique transaction -names. -If you are using an agent with 'use_path_as_transaction_name' enabled, it may cause -high cardinality. If your agent supports the 'transaction_name_groups' option, setting -that configuration option appropriately, may lead to better results.`[1:], - interval.String(), - a.config.MaxTransactionGroups, - overflowBucketName, - ) -} - -func makeOverflowAggregationKey( - oldKey transactionAggregationKey, - svcOverflow bool, - interval time.Duration, -) transactionAggregationKey { - svcName := oldKey.serviceName - if svcOverflow { - svcName = overflowBucketName - } - return transactionAggregationKey{ - comparable: comparable{ - // We are using `time.Now` here to align the overflow aggregation to - // the evaluation time rather than event time. This prevents us from - // cases of bad timestamps when the server receives some events with - // old timestamp and these events overflow causing the indexed event - // to have old timestamp too. - timestamp: time.Now().Truncate(interval), - transactionName: overflowBucketName, - serviceName: svcName, - }, - } -} - -func makeTransactionAggregationKey(event *modelpb.APMEvent, interval time.Duration) transactionAggregationKey { - key := transactionAggregationKey{ - comparable: comparable{ - traceRoot: event.GetParentId() == "", - transactionName: event.GetTransaction().GetName(), - transactionResult: event.GetTransaction().GetResult(), - transactionType: event.GetTransaction().GetType(), - eventOutcome: event.GetEvent().GetOutcome(), - - agentName: event.GetAgent().GetName(), - serviceEnvironment: event.GetService().GetEnvironment(), - serviceName: event.GetService().GetName(), - serviceVersion: event.GetService().GetVersion(), - serviceNodeName: event.GetService().GetNode().GetName(), - serviceRuntimeName: event.GetService().GetRuntime().GetName(), - serviceRuntimeVersion: event.GetService().GetRuntime().GetVersion(), - - serviceLanguageName: event.GetService().GetLanguage().GetName(), - serviceLanguageVersion: event.GetService().GetLanguage().GetVersion(), - - hostHostname: event.GetHost().GetHostname(), - hostName: event.GetHost().GetName(), - hostOSPlatform: event.GetHost().GetOs().GetPlatform(), - containerID: event.GetContainer().GetId(), - kubernetesPodName: event.GetKubernetes().GetPodName(), - - cloudProvider: event.GetCloud().GetProvider(), - cloudRegion: event.GetCloud().GetRegion(), - cloudAvailabilityZone: event.GetCloud().GetAvailabilityZone(), - cloudServiceName: event.GetCloud().GetServiceName(), - cloudAccountID: event.GetCloud().GetAccountId(), - cloudAccountName: event.GetCloud().GetAccountName(), - cloudProjectID: event.GetCloud().GetProjectId(), - cloudProjectName: event.GetCloud().GetProjectName(), - cloudMachineType: event.GetCloud().GetMachineType(), - - faasID: event.GetFaas().GetId(), - faasTriggerType: event.GetFaas().GetTriggerType(), - faasName: event.GetFaas().GetName(), - faasVersion: event.GetFaas().GetVersion(), - }, - } - if event.Timestamp != nil { - // Group metrics by time interval. - key.comparable.timestamp = event.Timestamp.AsTime().Truncate(interval) - } - if event.Faas != nil { - key.comparable.faasColdstart = nullableBoolFromPtr(event.Faas.ColdStart) - } - key.AggregatedGlobalLabels.Read(event) - return key -} - -// makeMetricset creates a metricset with key, metrics, and interval. -// It uses result from histogram for Transaction.DurationSummary and DocCount to avoid discrepancy and UI weirdness. -func makeMetricset(key transactionAggregationKey, metrics transactionMetrics, interval string) *modelpb.APMEvent { - totalCount, counts, values := metrics.histogramBuckets() - - var eventSuccessCount *modelpb.SummaryMetric - switch key.eventOutcome { - case "success": - eventSuccessCount = &modelpb.SummaryMetric{ - Count: totalCount, - Sum: float64(totalCount), - } - case "failure": - eventSuccessCount = &modelpb.SummaryMetric{ - Count: totalCount, - } - case "unknown": - // Keep both Count and Sum as 0. - } - - var t *timestamppb.Timestamp - if !key.timestamp.IsZero() { - t = timestamppb.New(key.timestamp) - } - - transactionDurationSummary := modelpb.SummaryMetric{ - Count: totalCount, - } - for i, v := range values { - transactionDurationSummary.Sum += v * float64(counts[i]) - } - - var agent *modelpb.Agent - if key.agentName != "" { - agent = &modelpb.Agent{Name: key.agentName} - } - - var container *modelpb.Container - if key.containerID != "" { - container = &modelpb.Container{Id: key.containerID} - } - - var hostOs *modelpb.OS - if key.hostOSPlatform != "" { - hostOs = &modelpb.OS{ - Platform: key.hostOSPlatform, - } - } - - var language *modelpb.Language - if key.serviceLanguageName != "" || key.serviceLanguageVersion != "" { - language = &modelpb.Language{ - Name: key.serviceLanguageName, - Version: key.serviceLanguageVersion, - } - } - - var serviceRuntime *modelpb.Runtime - if key.serviceRuntimeName != "" || key.serviceRuntimeVersion != "" { - serviceRuntime = &modelpb.Runtime{ - Name: key.serviceRuntimeName, - Version: key.serviceRuntimeVersion, - } - } - - var serviceNode *modelpb.ServiceNode - if key.serviceNodeName != "" { - serviceNode = &modelpb.ServiceNode{ - Name: key.serviceNodeName, - } - } - - var cloud *modelpb.Cloud - if key.cloudProvider != "" || key.cloudRegion != "" || key.cloudAvailabilityZone != "" || key.cloudServiceName != "" || key.cloudAccountID != "" || - key.cloudAccountName != "" || key.cloudMachineType != "" || key.cloudProjectID != "" || key.cloudProjectName != "" { - cloud = &modelpb.Cloud{ - Provider: key.cloudProvider, - Region: key.cloudRegion, - AvailabilityZone: key.cloudAvailabilityZone, - ServiceName: key.cloudServiceName, - AccountId: key.cloudAccountID, - AccountName: key.cloudAccountName, - MachineType: key.cloudMachineType, - ProjectId: key.cloudProjectID, - ProjectName: key.cloudProjectName, - } - } - - var hostStr *modelpb.Host - if key.hostHostname != "" || key.hostName != "" || hostOs != nil { - hostStr = &modelpb.Host{ - Hostname: key.hostHostname, - Name: key.hostName, - Os: hostOs, - } - } - - var service *modelpb.Service - if key.serviceName != "" || key.serviceVersion != "" || serviceNode != nil || key.serviceEnvironment != "" || serviceRuntime != nil || language != nil { - service = &modelpb.Service{ - Name: key.serviceName, - Version: key.serviceVersion, - Node: serviceNode, - Environment: key.serviceEnvironment, - Runtime: serviceRuntime, - Language: language, - } - } - - var kube *modelpb.Kubernetes - if key.kubernetesPodName != "" { - kube = &modelpb.Kubernetes{PodName: key.kubernetesPodName} - } - - var faas *modelpb.Faas - if key.faasColdstart.isSet || key.faasID != "" || key.faasTriggerType != "" || key.faasName != "" || key.faasVersion != "" { - faas = &modelpb.Faas{ - ColdStart: key.faasColdstart.toPtr(), - Id: key.faasID, - TriggerType: key.faasTriggerType, - Name: key.faasName, - Version: key.faasVersion, - } - } - - var eventStr *modelpb.Event - if key.eventOutcome != "" || eventSuccessCount != nil { - eventStr = &modelpb.Event{ - Outcome: key.eventOutcome, - SuccessCount: eventSuccessCount, - } - } - - return &modelpb.APMEvent{ - Timestamp: t, - Agent: agent, - Container: container, - Kubernetes: kube, - Service: service, - Cloud: cloud, - Host: hostStr, - Event: eventStr, - Faas: faas, - Labels: key.AggregatedGlobalLabels.Labels, - NumericLabels: key.AggregatedGlobalLabels.NumericLabels, - Metricset: &modelpb.Metricset{ - Name: metricsetName, - DocCount: totalCount, - Interval: interval, - }, - Transaction: &modelpb.Transaction{ - Name: key.transactionName, - Type: key.transactionType, - Result: key.transactionResult, - Root: key.traceRoot, - DurationHistogram: &modelpb.Histogram{ - Counts: counts, - Values: values, - }, - DurationSummary: &transactionDurationSummary, - }, - } -} - -type metrics struct { - mu sync.RWMutex - space *baseaggregator.Space[metricsMapEntry] - svcSpace *baseaggregator.Space[svcMetricsMapEntry] - m map[string]*svcMetricsMapEntry - // entries refer to the total number of tx groups getting aggregated excluding - // overflow. Used to identify overflow limit breaches as they only account for - // non-overflow groups. - entries int - // overflowedEntries refer to the total number of overflowed transaction groups - // getting aggregated. - overflowedEntries int - // services refer to the total number of services getting aggregated excluding - // overflow. Used to identify overflow limit breaches as they only account for - // non-overflow services. - services int -} - -func newMetrics(maxGroups, maxServices int) *metrics { - return &metrics{ - // Total number of entries = 1 per txn + 1 overflow per svc + 1 `_other` svc - space: baseaggregator.NewSpace[metricsMapEntry](maxGroups + maxServices + 1), - // keep 1 reserved entry for `_other` service - svcSpace: baseaggregator.NewSpace[svcMetricsMapEntry](maxServices + 1), - m: make(map[string]*svcMetricsMapEntry), - } -} - -func (m *metrics) searchMetricsEntry( - hash uint64, - key transactionAggregationKey, - offset int, -) (*svcMetricsMapEntry, *metricsMapEntry, int) { - svc, ok := m.m[key.serviceName] - if !ok { - return nil, nil, offset - } - entries, ok := svc.m[hash] - if !ok { - return svc, nil, offset - } - for ; offset < len(entries); offset++ { - entry := entries[offset] - if entry.transactionAggregationKey.equal(key) { - return svc, entry, offset + 1 - } - } - // return offset to indicate the next index that should be searched in future - // to continue looking for the aggregation key. This will be useful when read - // lock is upgraded to write lock and we need to attempt another search to - // handle race conditions. - return svc, nil, offset -} - -// newServiceEntry creates a new entry for a given service name. If overflow is true then -// it either creates a entry for overflow or returns the previously created entry. -func (m *metrics) newServiceEntry(svcName string, overflow bool) (*svcMetricsMapEntry, error) { - var err error - if overflow { - // put the overflow bucket as a service map to avoid handling it separately - // while publishing the metrics. - svc, ok := m.m[overflowBucketName] - if !ok { - svc, err = m.svcSpace.Next() - if err != nil { - return nil, err - } - m.m[overflowBucketName] = svc - } - return svc, nil - } - - svc, err := m.svcSpace.Next() - if err != nil { - return nil, err - } - if svc.m == nil { - svc.m = make(map[uint64][]*metricsMapEntry) - } - m.m[svcName] = svc - m.services++ - return svc, nil -} - -// newMetricsEntry creates a new entry for a transaction group metric. If overflow is true then -// it either creates a entry for overflow or returns the previously created entry. -func (m *metrics) newMetricsEntry( - svc *svcMetricsMapEntry, - hash uint64, - key transactionAggregationKey, - histogramPool *sync.Pool, - overflow bool, -) (*metricsMapEntry, error) { - getNewMetricsMapEntry := func() (*metricsMapEntry, error) { - entry, err := m.space.Next() - if err != nil { - return nil, err - } - entry.transactionAggregationKey = key - entry.transactionMetrics = transactionMetrics{ - histogram: histogramPool.Get().(*hdrhistogram.Histogram), - } - return entry, nil - } - if overflow { - if svc.other == nil { - entry, err := getNewMetricsMapEntry() - if err != nil { - return nil, err - } - svc.other = entry - svc.otherCardinalityEstimator = hyperloglog.New14() - m.overflowedEntries++ - } - svc.otherCardinalityEstimator.InsertHash(hash) - return svc.other, nil - } - - entry, err := getNewMetricsMapEntry() - if err != nil { - return entry, err - } - svc.m[hash] = append(svc.m[hash], entry) - m.entries++ - svc.entries++ - return entry, nil -} - -func (m *metrics) reset() { - for k := range m.m { - delete(m.m, k) - } - m.entries = 0 - m.services = 0 - m.space.Reset() - m.svcSpace.Reset() -} - -type svcMetricsMapEntry struct { - m map[uint64][]*metricsMapEntry - other *metricsMapEntry - otherCardinalityEstimator *hyperloglog.Sketch - // entries refer to the total transaction groups getting aggregated excluding overflow. - // Used to identify overflow limit breaches as they only account for non-overflow groups. - entries int -} - -func (s *svcMetricsMapEntry) reset() { - for k := range s.m { - delete(s.m, k) - } - s.other = nil - s.otherCardinalityEstimator = nil - s.entries = 0 -} - -type metricsMapEntry struct { - transactionMetrics - transactionAggregationKey -} - -func (e *metricsMapEntry) reset(pool *sync.Pool) { - e.histogram.Reset() - pool.Put(e.histogram) - e.histogram = nil -} - -type nullableBool struct { - isSet bool - val bool -} - -func (nb nullableBool) toPtr() *bool { - if !nb.isSet { - return nil - } - return &nb.val -} - -func nullableBoolFromPtr(b *bool) nullableBool { - return nullableBool{ - isSet: b != nil, - val: b != nil && *b, - } -} - -// comparable contains the fields with types which can be compared with the -// equal operator '=='. -type comparable struct { - timestamp time.Time - faasColdstart nullableBool - faasID string - faasName string - faasVersion string - agentName string - hostOSPlatform string - kubernetesPodName string - cloudProvider string - cloudRegion string - cloudAvailabilityZone string - cloudServiceName string - cloudAccountID string - cloudAccountName string - cloudMachineType string - cloudProjectID string - cloudProjectName string - serviceEnvironment string - serviceName string - serviceVersion string - serviceNodeName string - serviceRuntimeName string - serviceRuntimeVersion string - serviceLanguageName string - serviceLanguageVersion string - transactionName string - transactionResult string - transactionType string - eventOutcome string - faasTriggerType string - hostHostname string - hostName string - containerID string - traceRoot bool -} - -// NOTE(axw) the dimensions should be kept in sync with docs/data-model.asciidoc -// for the current documentation on the APM Server model. -type transactionAggregationKey struct { - labels.AggregatedGlobalLabels - comparable -} - -func (k *transactionAggregationKey) hash() uint64 { - var h xxhash.Digest - var buf [8]byte - binary.LittleEndian.PutUint64(buf[:], uint64(k.timestamp.UnixNano())) - h.Write(buf[:]) - if k.traceRoot { - h.WriteString("1") - } - if k.faasColdstart.isSet && k.faasColdstart.val { - h.WriteString("1") - } - k.AggregatedGlobalLabels.Write(&h) - h.WriteString(k.agentName) - h.WriteString(k.containerID) - h.WriteString(k.hostHostname) - h.WriteString(k.hostName) - h.WriteString(k.hostOSPlatform) - h.WriteString(k.kubernetesPodName) - h.WriteString(k.cloudProvider) - h.WriteString(k.cloudRegion) - h.WriteString(k.cloudAvailabilityZone) - h.WriteString(k.cloudServiceName) - h.WriteString(k.cloudAccountID) - h.WriteString(k.cloudAccountName) - h.WriteString(k.cloudMachineType) - h.WriteString(k.cloudProjectID) - h.WriteString(k.cloudProjectName) - h.WriteString(k.serviceEnvironment) - h.WriteString(k.serviceName) - h.WriteString(k.serviceVersion) - h.WriteString(k.serviceNodeName) - h.WriteString(k.serviceRuntimeName) - h.WriteString(k.serviceRuntimeVersion) - h.WriteString(k.serviceLanguageName) - h.WriteString(k.serviceLanguageVersion) - h.WriteString(k.transactionName) - h.WriteString(k.transactionResult) - h.WriteString(k.transactionType) - h.WriteString(k.eventOutcome) - h.WriteString(k.faasID) - h.WriteString(k.faasTriggerType) - h.WriteString(k.faasName) - h.WriteString(k.faasVersion) - return h.Sum64() -} - -func (k *transactionAggregationKey) equal(key transactionAggregationKey) bool { - return k.comparable == key.comparable && - k.AggregatedGlobalLabels.Equals(&key.AggregatedGlobalLabels) -} - -type transactionMetrics struct { - histogram *hdrhistogram.Histogram -} - -func (m *transactionMetrics) recordDuration(d time.Duration, n float64) { - count := int64(math.Round(n * histogramCountScale)) - m.histogram.RecordValuesAtomic(d.Microseconds(), count) -} - -func (m *transactionMetrics) histogramBuckets() (totalCount uint64, counts []uint64, values []float64) { - // From https://www.elastic.co/guide/en/elasticsearch/reference/current/histogram.html: - // - // "For the High Dynamic Range (HDR) histogram mode, the values array represents - // fixed upper limits of each bucket interval, and the counts array represents - // the number of values that are attributed to each interval." - distribution := m.histogram.Distribution() - counts = make([]uint64, 0, len(distribution)) - values = make([]float64, 0, len(distribution)) - for _, b := range distribution { - if b.Count <= 0 { - continue - } - count := uint64(math.Round(float64(b.Count) / histogramCountScale)) - counts = append(counts, count) - values = append(values, float64(b.To)) - totalCount += count - } - return totalCount, counts, values -} diff --git a/x-pack/apm-server/aggregation/txmetrics/aggregator_test.go b/x-pack/apm-server/aggregation/txmetrics/aggregator_test.go deleted file mode 100644 index 01e0bebda0e..00000000000 --- a/x-pack/apm-server/aggregation/txmetrics/aggregator_test.go +++ /dev/null @@ -1,899 +0,0 @@ -// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one -// or more contributor license agreements. Licensed under the Elastic License 2.0; -// you may not use this file except in compliance with the Elastic License 2.0. - -package txmetrics_test - -import ( - "context" - "fmt" - "sort" - "testing" - "time" - - "github.com/google/go-cmp/cmp" - "github.com/google/go-cmp/cmp/cmpopts" - "github.com/pkg/errors" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "go.uber.org/zap" - "go.uber.org/zap/zapcore" - "go.uber.org/zap/zaptest/observer" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/testing/protocmp" - "google.golang.org/protobuf/types/known/durationpb" - "google.golang.org/protobuf/types/known/timestamppb" - - "github.com/elastic/apm-data/model/modelpb" - "github.com/elastic/apm-server/x-pack/apm-server/aggregation/txmetrics" - "github.com/elastic/elastic-agent-libs/logp" - "github.com/elastic/elastic-agent-libs/monitoring" -) - -func TestNewAggregatorConfigInvalid(t *testing.T) { - batchProcessor := makeErrBatchProcessor(nil) - - type test struct { - config txmetrics.AggregatorConfig - err string - } - - for _, test := range []test{{ - config: txmetrics.AggregatorConfig{}, - err: "BatchProcessor unspecified", - }, { - config: txmetrics.AggregatorConfig{ - BatchProcessor: batchProcessor, - }, - err: "MaxTransactionGroups unspecified or negative", - }, { - config: txmetrics.AggregatorConfig{ - BatchProcessor: batchProcessor, - MaxTransactionGroups: 1, - }, - err: "MaxTransactionGroupsPerService unspecified or negative", - }, { - config: txmetrics.AggregatorConfig{ - BatchProcessor: batchProcessor, - MaxTransactionGroups: 1, - MaxTransactionGroupsPerService: 1, - }, - err: "MaxServices unspecified or negative", - }, { - config: txmetrics.AggregatorConfig{ - BatchProcessor: batchProcessor, - MaxTransactionGroups: 1, - MaxTransactionGroupsPerService: 1, - MaxServices: 1, - HDRHistogramSignificantFigures: 5, - }, - err: "Interval unspecified or negative", - }, { - config: txmetrics.AggregatorConfig{ - BatchProcessor: batchProcessor, - MaxTransactionGroups: 1, - MaxTransactionGroupsPerService: 1, - MaxServices: 1, - MetricsInterval: time.Nanosecond, - HDRHistogramSignificantFigures: 6, - }, - err: "HDRHistogramSignificantFigures (6) outside range [1,5]", - }} { - agg, err := txmetrics.NewAggregator(test.config) - require.Error(t, err) - require.Nil(t, agg) - assert.EqualError(t, err, "invalid aggregator config: "+test.err) - } -} - -func TestTxnAggregator_ResetAfterPublish(t *testing.T) { - batches := make(chan modelpb.Batch, 1) - agg, err := txmetrics.NewAggregator(txmetrics.AggregatorConfig{ - BatchProcessor: makeChanBatchProcessor(batches), - MaxServices: 3, - MaxTransactionGroups: 3, - MaxTransactionGroupsPerService: 2, - MetricsInterval: 100 * time.Millisecond, - HDRHistogramSignificantFigures: 5, - }) - assert.NoError(t, err) - batch := modelpb.Batch{ - &modelpb.APMEvent{ - Event: &modelpb.Event{ - Outcome: "success", - Duration: durationpb.New(time.Second), - }, - Transaction: &modelpb.Transaction{ - Type: "type", - Name: "txn1", - RepresentativeCount: 1, - }, - Service: &modelpb.Service{Name: "svc1"}, - }, - } - go func(t *testing.T) { - t.Helper() - require.NoError(t, agg.Run()) - }(t) - - registry := monitoring.NewRegistry() - monitoring.NewFunc(registry, "txmetrics", agg.CollectMonitoring) - for i := 0; i < 5; i++ { - // The repition count should be set to be higher than 2 because - // the aggregators use two datastructures: active and inactive. - - // Each batch has the same transactions configured to not overflow - require.NoError(t, agg.ProcessBatch(context.Background(), &batch)) - batchMetricsets(t, expectBatch(t, batches)) - expectedMonitoring := monitoring.MakeFlatSnapshot() - // active_groups is a counter so it will increase for every iteration - // there should be no expected overflow - expectedMonitoring.Ints["txmetrics.active_groups"] = int64(i + 1) - expectedMonitoring.Ints["txmetrics.overflowed.per_service_txn_groups"] = 0 - expectedMonitoring.Ints["txmetrics.overflowed.txn_groups"] = 0 - expectedMonitoring.Ints["txmetrics.overflowed.services"] = 0 - expectedMonitoring.Ints["txmetrics.overflowed.total"] = 0 - assert.Equal(t, expectedMonitoring, monitoring.CollectFlatSnapshot( - registry, - monitoring.Full, - false, - )) - } -} - -func TestTxnAggregatorProcessBatch(t *testing.T) { - const txnDuration = 100 * time.Millisecond - for _, tc := range []struct { - // all unique txns are distributed in unique services sequentially - // for 7 transactions and 3 services; first three service will receive - // 2 txns and the last one will receive 1 txn. - // Note that practically uniqueTxnCount will always be >= uniqueServices. - name string - - // aggregation limits - maxServicesLimit int - maxTxnGroupsLimit int - maxTxnGroupsPerSvcLimit int - - // load distribution of unique transactions across services - uniqueTxnCount int - uniqueServices int - - expectedActiveGroups int - // expectedOverflowReasonPerSvcTxnGrps represent total number of txn groups - // that overflowed due to per service txn group limit assuming all servies - // overflow equally. These will be recorded in the `transaction.name: _other` - // and the corresponding service name documents. - expectedOverflowReasonPerSvcTxnGrps int - // expectedOverflowReasonTxnGrps represent total number of txn groups that - // overflowed due to max txn groups limit. These will be recorded in the - // `transaction.name: _other` and the corresponding service name documents. - expectedOverflowReasonTxnGrps int - // expectedOverflowReasonSvc represents total number of txn groups that - // overflowed due to max services limit. These will be recorded in the - // `transaction.name: _other` and the `service.name: _other` document. - expectedOverflowReasonSvc int - }{ - { - name: "no_overflow", - - maxServicesLimit: 10, - maxTxnGroupsPerSvcLimit: 10, - maxTxnGroupsLimit: 100, - - uniqueTxnCount: 100, - uniqueServices: 10, - - expectedActiveGroups: 100, - expectedOverflowReasonPerSvcTxnGrps: 0, - expectedOverflowReasonTxnGrps: 0, - expectedOverflowReasonSvc: 0, - }, - { - name: "overflow_for_max_per_svc_txn_grps", - - maxServicesLimit: 20, - maxTxnGroupsPerSvcLimit: 10, - maxTxnGroupsLimit: 100, - - uniqueTxnCount: 100, - uniqueServices: 5, - - expectedActiveGroups: 55, // 10 txn groups + 1 overflow per service - expectedOverflowReasonPerSvcTxnGrps: 50, - expectedOverflowReasonTxnGrps: 0, - expectedOverflowReasonSvc: 0, - }, - { - name: "overflow_for_max_txn_grps", - - maxServicesLimit: 20, - maxTxnGroupsPerSvcLimit: 10, - maxTxnGroupsLimit: 100, - - uniqueTxnCount: 200, - uniqueServices: 20, - - expectedActiveGroups: 120, - expectedOverflowReasonPerSvcTxnGrps: 0, - expectedOverflowReasonTxnGrps: 100, - expectedOverflowReasonSvc: 0, - }, - { - name: "overflow_for_max_svcs", - - maxServicesLimit: 10, - maxTxnGroupsPerSvcLimit: 10, - maxTxnGroupsLimit: 100, - - uniqueTxnCount: 200, - uniqueServices: 20, - - expectedActiveGroups: 101, - expectedOverflowReasonPerSvcTxnGrps: 0, - expectedOverflowReasonTxnGrps: 0, - expectedOverflowReasonSvc: 100, - }, - { - name: "overflow_for_max_svcs_and_max_per_svc_txn_grps", - - maxServicesLimit: 10, - maxTxnGroupsPerSvcLimit: 10, - maxTxnGroupsLimit: 100, - - uniqueTxnCount: 400, - uniqueServices: 20, - - expectedActiveGroups: 111, - expectedOverflowReasonPerSvcTxnGrps: 100, - expectedOverflowReasonTxnGrps: 0, - expectedOverflowReasonSvc: 200, - }, - } { - t.Run(tc.name, func(t *testing.T) { - batches := make(chan modelpb.Batch, 1) - agg, err := txmetrics.NewAggregator(txmetrics.AggregatorConfig{ - BatchProcessor: makeChanBatchProcessor(batches), - MaxServices: tc.maxServicesLimit, - MaxTransactionGroups: tc.maxTxnGroupsLimit, - MaxTransactionGroupsPerService: tc.maxTxnGroupsPerSvcLimit, - MetricsInterval: 30 * time.Second, - HDRHistogramSignificantFigures: 5, - }) - require.NoError(t, err) - - repCount := 1 - batch := make(modelpb.Batch, tc.uniqueTxnCount*repCount) - for i := 0; i < len(batch); i++ { - batch[i] = &modelpb.APMEvent{ - Event: &modelpb.Event{ - Outcome: "success", - Duration: durationpb.New(txnDuration), - }, - Transaction: &modelpb.Transaction{ - Type: "type", - Name: fmt.Sprintf("foo%d", i%tc.uniqueTxnCount), - RepresentativeCount: 1, - }, - Service: &modelpb.Service{Name: fmt.Sprintf("svc%d", i%tc.uniqueServices)}, - } - } - go func(t *testing.T) { - t.Helper() - require.NoError(t, agg.Run()) - }(t) - require.NoError(t, agg.ProcessBatch(context.Background(), &batch)) - require.NoError(t, agg.Stop(context.Background())) - metricsets := batchMetricsets(t, expectBatch(t, batches)) - expectedMonitoring := monitoring.MakeFlatSnapshot() - - expectedMonitoring.Ints["txmetrics.active_groups"] = int64(tc.expectedActiveGroups) - expectedMonitoring.Ints["txmetrics.overflowed.per_service_txn_groups"] = int64(tc.expectedOverflowReasonPerSvcTxnGrps) - expectedMonitoring.Ints["txmetrics.overflowed.txn_groups"] = int64(tc.expectedOverflowReasonTxnGrps) - expectedMonitoring.Ints["txmetrics.overflowed.services"] = int64(tc.expectedOverflowReasonSvc) - expectedMonitoring.Ints["txmetrics.overflowed.total"] = int64( - tc.expectedOverflowReasonPerSvcTxnGrps + tc.expectedOverflowReasonTxnGrps + tc.expectedOverflowReasonSvc) - registry := monitoring.NewRegistry() - monitoring.NewFunc(registry, "txmetrics", agg.CollectMonitoring) - assert.Equal(t, expectedMonitoring, monitoring.CollectFlatSnapshot( - registry, - monitoring.Full, - false, // expvar - )) - - var expectedOverflowMetricsets []*modelpb.APMEvent - var totalOverflowSvcCount int - totalOverflowIntoAllSvcBuckets := tc.expectedOverflowReasonPerSvcTxnGrps + tc.expectedOverflowReasonTxnGrps - // Assuming that all services in the test will overflow equally, any overflow due to max - // transaction groups or per service transaction group limit limit will overflow into the - // corresponding service's overflow bucket uptil the max services limit. - if totalOverflowIntoAllSvcBuckets > 0 { - totalOverflowSvcCount = tc.uniqueServices - if tc.uniqueServices > tc.maxServicesLimit { - totalOverflowSvcCount = tc.maxServicesLimit - } - } - // If there are any overflows due to the max services limit then the overflow - // will be aggregated under a special `service.name: _other` bucket. - if tc.expectedOverflowReasonSvc > 0 { - expectedOverflowMetricsets = append( - expectedOverflowMetricsets, - createOverflowMetricset(tc.expectedOverflowReasonSvc, repCount, txnDuration), - ) - } - for i := 0; i < totalOverflowSvcCount; i++ { - totalOverflowForEachSvcBuckets := totalOverflowIntoAllSvcBuckets / totalOverflowSvcCount - expectedOverflowMetricsets = append( - expectedOverflowMetricsets, - createOverflowMetricset(totalOverflowForEachSvcBuckets, repCount, txnDuration), - ) - } - var expectedMetrics []*modelpb.APMEvent - var finalMetricset []*modelpb.APMEvent - for _, v := range metricsets { - if v.Transaction.Name == "_other" { - finalMetricset = append(finalMetricset, v) - } - } - for _, a := range expectedOverflowMetricsets { - if a.Transaction.Name == "_other" { - expectedMetrics = append(expectedMetrics, a) - } - } - assert.Empty(t, cmp.Diff( - expectedMetrics, - finalMetricset, - protocmp.Transform(), - protocmp.IgnoreFields(&modelpb.APMEvent{}, "timestamp"), - protocmp.IgnoreFields(&modelpb.Service{}, "name"), - cmpopts.SortSlices(func(a, b *modelpb.APMEvent) bool { - return a.GetService().GetName() < b.GetService().GetName() - }), - )) - }) - } -} - -func TestAggregatorRun(t *testing.T) { - batches := make(chan modelpb.Batch, 6) - config := txmetrics.AggregatorConfig{ - BatchProcessor: makeChanBatchProcessor(batches), - MaxTransactionGroups: 2, - MaxTransactionGroupsPerService: 2, - MaxServices: 2, - MetricsInterval: 10 * time.Millisecond, - RollUpIntervals: []time.Duration{200 * time.Millisecond, time.Second}, - HDRHistogramSignificantFigures: 1, - } - agg, err := txmetrics.NewAggregator(config) - require.NoError(t, err) - - intervals := append([]time.Duration{config.MetricsInterval}, config.RollUpIntervals...) - now := time.Now().UTC() - for i := 0; i < 1000; i++ { - event := modelpb.APMEvent{ - Event: &modelpb.Event{Duration: durationpb.New(time.Second)}, - Timestamp: timestamppb.New(now), - Labels: modelpb.Labels{ - "department_name": &modelpb.LabelValue{Global: true, Value: "apm"}, - "organization": &modelpb.LabelValue{Global: true, Value: "observability"}, - "company": &modelpb.LabelValue{Global: true, Value: "elastic"}, - }, - NumericLabels: modelpb.NumericLabels{ - "user_id": &modelpb.NumericLabelValue{Global: true, Value: 100}, - "cost_center": &modelpb.NumericLabelValue{Global: true, Value: 10}, - }, - Transaction: &modelpb.Transaction{ - Type: "type", - Name: "T-1000", - RepresentativeCount: 1, - }, - } - if i%2 == 0 { - event.Event = &modelpb.Event{Duration: durationpb.New(100 * time.Millisecond)} - } - agg.AggregateTransaction(&event) - } - for i := 0; i < 800; i++ { - event := modelpb.APMEvent{ - Event: &modelpb.Event{Duration: durationpb.New(time.Second)}, - Timestamp: timestamppb.New(now), - Transaction: &modelpb.Transaction{ - Type: "type", - Name: "T-800", - RepresentativeCount: 2.5, - }, - } - if i%2 == 0 { - event.Event = &modelpb.Event{Duration: durationpb.New(100 * time.Millisecond)} - } - agg.AggregateTransaction(&event) - } - - go agg.Run() - defer agg.Stop(context.Background()) - // Stop the aggregator to ensure all metrics are published. - assert.NoError(t, agg.Stop(context.Background())) - - for i := 0; i < 3; i++ { - batch := expectBatch(t, batches) - metricsets := batchMetricsets(t, batch) - require.Len(t, metricsets, 2) - sort.Slice(metricsets, func(i, j int) bool { - return metricsets[i].Transaction.Name < metricsets[j].Transaction.Name - }) - - assert.Equal(t, "T-1000", metricsets[0].Transaction.Name) - assert.Equal(t, modelpb.Labels{ - "department_name": &modelpb.LabelValue{Value: "apm"}, - "organization": &modelpb.LabelValue{Value: "observability"}, - "company": &modelpb.LabelValue{Value: "elastic"}, - }, modelpb.Labels(metricsets[0].Labels)) - assert.Equal(t, modelpb.NumericLabels{ - "user_id": &modelpb.NumericLabelValue{Value: 100}, - "cost_center": &modelpb.NumericLabelValue{Value: 10}, - }, modelpb.NumericLabels(metricsets[0].NumericLabels)) - assert.Equal(t, []uint64{500, 500}, metricsets[0].Transaction.DurationHistogram.Counts) - assert.Equal(t, "T-800", metricsets[1].Transaction.Name) - assert.Empty(t, metricsets[1].Labels) - assert.Empty(t, metricsets[1].NumericLabels) - assert.Equal(t, []uint64{1000, 1000}, metricsets[1].Transaction.DurationHistogram.Counts) - for _, event := range metricsets { - actual := event.Timestamp.AsTime() - if event.Timestamp == nil { - actual = time.Time{} - } - assert.Equal(t, now.Truncate(intervals[i]), actual) - assert.Equal(t, fmt.Sprintf("%.0fs", intervals[i].Seconds()), event.Metricset.Interval) - } - } - - select { - case <-batches: - t.Fatal("unexpected publish") - case <-time.After(100 * time.Millisecond): - } -} - -func TestAggregatorRunPublishErrors(t *testing.T) { - batches := make(chan modelpb.Batch, 1) - chanBatchProcessor := makeChanBatchProcessor(batches) - processBatchErr := errors.New("report failed") - var batchProcessor modelpb.ProcessBatchFunc = func(ctx context.Context, batch *modelpb.Batch) error { - if err := chanBatchProcessor(ctx, batch); err != nil { - return err - } - return processBatchErr - } - - core, observed := observer.New(zapcore.DebugLevel) - logger := logp.NewLogger("foo", zap.WrapCore(func(in zapcore.Core) zapcore.Core { - return zapcore.NewTee(in, core) - })) - - agg, err := txmetrics.NewAggregator(txmetrics.AggregatorConfig{ - BatchProcessor: batchProcessor, - MaxTransactionGroups: 2, - MaxTransactionGroupsPerService: 1, - MaxServices: 2, - MetricsInterval: 10 * time.Millisecond, - HDRHistogramSignificantFigures: 1, - Logger: logger, - }) - require.NoError(t, err) - - go agg.Run() - defer agg.Stop(context.Background()) - - for i := 0; i < 2; i++ { - agg.AggregateTransaction(&modelpb.APMEvent{ - Transaction: &modelpb.Transaction{ - Type: "type", - Name: "T-1000", - RepresentativeCount: 1, - }, - }) - expectBatch(t, batches) - } - - // Wait for aggregator to stop before checking logs, to ensure we don't race with logging. - assert.NoError(t, agg.Stop(context.Background())) - - logs := observed.FilterMessageSnippet("report failed").All() - assert.Len(t, logs, 2) - for _, record := range logs { - require.Len(t, record.Context, 1) - assert.Equal(t, "error", record.Context[0].Key) - assert.Equal(t, processBatchErr, record.Context[0].Interface) - } -} - -func TestAggregateRepresentativeCount(t *testing.T) { - for _, tc := range []struct { - name string - representativeCounts []float64 - expectedCount uint64 - }{ - { - name: "int", - representativeCounts: []float64{2}, - expectedCount: 2, - }, - { - name: "float", - representativeCounts: []float64{1.50}, - expectedCount: 2, - }, - { - name: "mix", - representativeCounts: []float64{1, 1.5}, - expectedCount: 3, - }, - } { - t.Run(tc.name, func(t *testing.T) { - batches := make(chan modelpb.Batch, 1) - agg, err := txmetrics.NewAggregator(txmetrics.AggregatorConfig{ - BatchProcessor: makeChanBatchProcessor(batches), - MaxTransactionGroups: 1, - MaxTransactionGroupsPerService: 1, - MaxServices: 1, - MetricsInterval: time.Microsecond, - HDRHistogramSignificantFigures: 1, - }) - require.NoError(t, err) - - for _, rc := range tc.representativeCounts { - agg.AggregateTransaction(&modelpb.APMEvent{ - Transaction: &modelpb.Transaction{ - Type: "type", - Name: "foo", - RepresentativeCount: rc, - }, - }) - } - - go agg.Run() - require.NoError(t, agg.Stop(context.Background())) - - batch := expectBatch(t, batches) - metricsets := batchMetricsets(t, batch) - require.Len(t, metricsets, 1) - require.Nil(t, metricsets[0].Metricset.Samples) - require.NotNil(t, metricsets[0].Transaction) - durationHistogram := metricsets[0].Transaction.DurationHistogram - assert.Equal(t, []uint64{tc.expectedCount}, durationHistogram.Counts) - }) - } -} - -func TestAggregateTimestamp(t *testing.T) { - batches := make(chan modelpb.Batch, 1) - agg, err := txmetrics.NewAggregator(txmetrics.AggregatorConfig{ - BatchProcessor: makeChanBatchProcessor(batches), - MaxTransactionGroups: 2, - MaxTransactionGroupsPerService: 2, - MaxServices: 2, - MetricsInterval: 30 * time.Second, - HDRHistogramSignificantFigures: 1, - }) - require.NoError(t, err) - - t0 := time.Unix(0, 0).UTC() - for _, ts := range []time.Time{t0, t0.Add(15 * time.Second), t0.Add(30 * time.Second)} { - agg.AggregateTransaction(&modelpb.APMEvent{ - Timestamp: timestamppb.New(ts), - Transaction: &modelpb.Transaction{ - Type: "type", - Name: "name", - RepresentativeCount: 1, - }, - }) - } - - go agg.Run() - err = agg.Stop(context.Background()) // stop to flush - require.NoError(t, err) - - batch := expectBatch(t, batches) - metricsets := batchMetricsets(t, batch) - require.Len(t, metricsets, 2) - sort.Slice(metricsets, func(i, j int) bool { - return metricsets[i].Timestamp.AsTime().Before(metricsets[j].Timestamp.AsTime()) - }) - assert.Equal(t, t0, metricsets[0].Timestamp.AsTime()) - assert.Equal(t, t0.Add(30*time.Second), metricsets[1].Timestamp.AsTime()) -} - -func TestHDRHistogramSignificantFigures(t *testing.T) { - testHDRHistogramSignificantFigures(t, 1) - testHDRHistogramSignificantFigures(t, 2) - testHDRHistogramSignificantFigures(t, 3) - testHDRHistogramSignificantFigures(t, 4) - testHDRHistogramSignificantFigures(t, 5) -} - -func testHDRHistogramSignificantFigures(t *testing.T, sigfigs int) { - t.Run(fmt.Sprintf("%d_sigfigs", sigfigs), func(t *testing.T) { - batches := make(chan modelpb.Batch, 1) - agg, err := txmetrics.NewAggregator(txmetrics.AggregatorConfig{ - BatchProcessor: makeChanBatchProcessor(batches), - MaxTransactionGroups: 2, - MaxTransactionGroupsPerService: 1, - MaxServices: 2, - MetricsInterval: 10 * time.Millisecond, - HDRHistogramSignificantFigures: sigfigs, - }) - require.NoError(t, err) - - // The following values will be recorded in either 1, 2, 3, 4, or 5 - // buckets according to the configured number of significant figures. - for _, duration := range []time.Duration{ - 100000 * time.Microsecond, - 101000 * time.Microsecond, - 101100 * time.Microsecond, - 101110 * time.Microsecond, - 101111 * time.Microsecond, - } { - agg.AggregateTransaction(&modelpb.APMEvent{ - Event: &modelpb.Event{Duration: durationpb.New(duration)}, - Transaction: &modelpb.Transaction{ - Type: "type", - Name: "T-1000", - RepresentativeCount: 1, - }, - }) - } - - go agg.Run() - defer agg.Stop(context.Background()) - - batch := expectBatch(t, batches) - metricsets := batchMetricsets(t, batch) - require.Len(t, metricsets, 1) - - require.Nil(t, metricsets[0].Metricset.Samples) - require.NotNil(t, metricsets[0].Transaction) - durationHistogram := metricsets[0].Transaction.DurationHistogram - assert.Len(t, durationHistogram.Counts, len(durationHistogram.Values)) - assert.Len(t, durationHistogram.Counts, sigfigs) - }) -} - -func TestAggregationFields(t *testing.T) { - t.Skip("TODO FIX") - batches := make(chan modelpb.Batch, 1) - agg, err := txmetrics.NewAggregator(txmetrics.AggregatorConfig{ - BatchProcessor: makeChanBatchProcessor(batches), - MaxTransactionGroups: 1000, - MaxTransactionGroupsPerService: 100, - MaxServices: 3, - MetricsInterval: 100 * time.Millisecond, - HDRHistogramSignificantFigures: 1, - }) - require.NoError(t, err) - go agg.Run() - defer agg.Stop(context.Background()) - - input := modelpb.APMEvent{ - Transaction: &modelpb.Transaction{ - Type: "type", - RepresentativeCount: 1, - }, - Event: &modelpb.Event{}, - Agent: &modelpb.Agent{}, - Service: &modelpb.Service{Node: &modelpb.ServiceNode{}, Language: &modelpb.Language{}, Runtime: &modelpb.Runtime{}}, - Container: &modelpb.Container{}, - Kubernetes: &modelpb.Kubernetes{}, - Cloud: &modelpb.Cloud{}, - Host: &modelpb.Host{Os: &modelpb.OS{}}, - Faas: &modelpb.Faas{}, - } - inputFields := []*string{ - &input.Transaction.Name, - &input.Transaction.Result, - &input.Transaction.Type, - &input.Event.Outcome, - &input.Agent.Name, - &input.Service.Environment, - &input.Service.Name, - &input.Service.Version, - &input.Service.Node.Name, - &input.Container.Id, - &input.Kubernetes.PodName, - &input.Cloud.Provider, - &input.Cloud.Region, - &input.Cloud.AvailabilityZone, - &input.Cloud.AccountId, - &input.Cloud.AccountName, - &input.Cloud.ProjectId, - &input.Cloud.ProjectName, - &input.Cloud.MachineType, - &input.Cloud.ServiceName, - &input.Service.Language.Name, - &input.Service.Language.Version, - &input.Service.Runtime.Name, - &input.Service.Runtime.Version, - &input.Host.Os.Platform, - &input.Faas.Id, - &input.Faas.TriggerType, - &input.Faas.Name, - &input.Faas.Version, - } - boolPtrInputFields := []**bool{ - &input.Faas.ColdStart, - } - - var expected []*modelpb.APMEvent - addExpectedCount := func(expectedCount uint64) { - expectedEvent := proto.Clone(&input).(*modelpb.APMEvent) - expectedEvent.Transaction = &modelpb.Transaction{ - Name: input.Transaction.Name, - Type: input.Transaction.Type, - Result: input.Transaction.Result, - Root: input.GetParentId() == "", - DurationHistogram: &modelpb.Histogram{ - Counts: []uint64{expectedCount}, - Values: []float64{0}, - }, - DurationSummary: &modelpb.SummaryMetric{ - Count: expectedCount, - Sum: 0, - }, - } - expectedEvent.Event.Outcome = input.Event.Outcome - expectedEvent.Metricset = &modelpb.Metricset{ - Name: "transaction", - DocCount: expectedCount, - Interval: "0s", - } - expected = append(expected, expectedEvent) - } - for _, field := range inputFields { - for _, value := range []string{"something", "anything"} { - *field = value - agg.AggregateTransaction(&input) - agg.AggregateTransaction(&input) - addExpectedCount(2) - } - } - for _, field := range boolPtrInputFields { - for _, value := range []bool{false, true} { - value := value - *field = &value - agg.AggregateTransaction(&input) - agg.AggregateTransaction(&input) - addExpectedCount(2) - } - *field = nil - } - - if false { - // Hostname is complex: if any kubernetes fields are set, then - // it is taken from Kubernetes.Node.Name, and DetectedHostname - // is ignored. - input.Kubernetes.PodName = "" - for _, value := range []string{"something", "anything"} { - input.Host.Hostname = value - agg.AggregateTransaction(&input) - agg.AggregateTransaction(&input) - addExpectedCount(2) - } - - // Parent.ID only impacts aggregation as far as grouping root and - // non-root traces. - for _, value := range []string{"something", "anything"} { - input.ParentId = value - agg.AggregateTransaction(&input) - agg.AggregateTransaction(&input) - } - addExpectedCount(4) - } - - batch := expectBatch(t, batches) - metricsets := batchMetricsets(t, batch) - assert.Empty(t, cmp.Diff(expected, metricsets, - protocmp.Transform(), - protocmp.IgnoreEmptyMessages(), - cmpopts.SortSlices(func(x, y *modelpb.APMEvent) bool { - if x.GetTransaction().GetName() != y.GetTransaction().GetName() { - return x.GetTransaction().GetName() < y.GetTransaction().GetName() - } - if x.GetEvent().GetOutcome() != y.GetEvent().GetOutcome() { - return x.GetEvent().GetOutcome() < y.GetEvent().GetOutcome() - } - return x.GetAgent().GetName() < y.GetAgent().GetName() - }), - )) -} - -func BenchmarkAggregateTransaction(b *testing.B) { - agg, err := txmetrics.NewAggregator(txmetrics.AggregatorConfig{ - BatchProcessor: makeErrBatchProcessor(nil), - MaxTransactionGroups: 1000, - MaxTransactionGroupsPerService: 100, - MaxServices: 1000, - MetricsInterval: time.Minute, - HDRHistogramSignificantFigures: 2, - }) - require.NoError(b, err) - - event := modelpb.APMEvent{ - Event: &modelpb.Event{Duration: durationpb.New(time.Millisecond)}, - Transaction: &modelpb.Transaction{ - Type: "type", - Name: "T-1000", - RepresentativeCount: 1, - }, - } - - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - agg.AggregateTransaction(&event) - } - }) -} - -func makeErrBatchProcessor(err error) modelpb.ProcessBatchFunc { - return func(context.Context, *modelpb.Batch) error { return err } -} - -func makeChanBatchProcessor(ch chan<- modelpb.Batch) modelpb.ProcessBatchFunc { - return func(ctx context.Context, batch *modelpb.Batch) error { - select { - case <-ctx.Done(): - return ctx.Err() - case ch <- *batch: - return nil - } - } -} - -func expectBatch(t *testing.T, ch <-chan modelpb.Batch) modelpb.Batch { - t.Helper() - select { - case batch := <-ch: - return batch - case <-time.After(time.Second): - t.Fatal("expected publish") - } - panic("unreachable") -} - -func batchMetricsets(t testing.TB, batch modelpb.Batch) []*modelpb.APMEvent { - var metricsets []*modelpb.APMEvent - for _, event := range batch { - if event.Metricset == nil { - continue - } - metricsets = append(metricsets, event) - } - return metricsets -} - -func createOverflowMetricset(overflowCount, repCount int, txnDuration time.Duration) *modelpb.APMEvent { - return &modelpb.APMEvent{ - Service: &modelpb.Service{}, - Transaction: &modelpb.Transaction{ - Name: "_other", - DurationHistogram: &modelpb.Histogram{ - Counts: []uint64{uint64(overflowCount * repCount)}, - Values: []float64{float64(txnDuration.Microseconds())}, - }, - DurationSummary: &modelpb.SummaryMetric{ - Count: uint64(overflowCount * repCount), - Sum: float64(time.Duration(float64(overflowCount*repCount) * float64(txnDuration)).Microseconds()), - }, - }, - Metricset: &modelpb.Metricset{ - Name: "transaction", - DocCount: uint64(overflowCount * repCount), - Interval: "30s", - Samples: []*modelpb.MetricsetSample{ - { - Name: "transaction.aggregation.overflow_count", - Value: float64(overflowCount), - }, - }, - }, - } -} diff --git a/x-pack/apm-server/main.go b/x-pack/apm-server/main.go index a5aea01aa89..c3c5e68fb26 100644 --- a/x-pack/apm-server/main.go +++ b/x-pack/apm-server/main.go @@ -6,10 +6,8 @@ package main import ( "context" - "math" "os" "sync" - "time" "github.com/dgraph-io/badger/v2" "github.com/gofrs/uuid" @@ -30,22 +28,16 @@ import ( "github.com/elastic/apm-data/model/modelprocessor" "github.com/elastic/apm-server/internal/beatcmd" "github.com/elastic/apm-server/internal/beater" - "github.com/elastic/apm-server/x-pack/apm-server/aggregation/servicesummarymetrics" - "github.com/elastic/apm-server/x-pack/apm-server/aggregation/servicetxmetrics" - "github.com/elastic/apm-server/x-pack/apm-server/aggregation/spanmetrics" - "github.com/elastic/apm-server/x-pack/apm-server/aggregation/txmetrics" + "github.com/elastic/apm-server/x-pack/apm-server/aggregation" "github.com/elastic/apm-server/x-pack/apm-server/sampling" "github.com/elastic/apm-server/x-pack/apm-server/sampling/eventstorage" ) const ( tailSamplingStorageDir = "tail_sampling" - metricsInterval = time.Minute ) var ( - aggregationMonitoringRegistry = monitoring.Default.NewRegistry("apm-server.aggregation") - // Note: this registry is created in github.com/elastic/apm-server/sampling. That package // will hopefully disappear in the future, when agents no longer send unsampled transactions. samplingMonitoringRegistry = monitoring.Default.GetRegistry("apm-server.sampling") @@ -60,8 +52,6 @@ var ( // samplerUUID is a UUID used to identify sampled trace ID documents // published by this process. samplerUUID = uuid.Must(uuid.NewV4()) - - rollUpMetricsIntervals = []time.Duration{10 * time.Minute, time.Hour} ) func init() { @@ -100,85 +90,21 @@ type processor interface { // newProcessors returns a list of processors which will process // events in sequential order, prior to the events being published. func newProcessors(args beater.ServerParams) ([]namedProcessor, error) { - processors := make([]namedProcessor, 0, 5) - const txName = "transaction metrics aggregation" - args.Logger.Infof("creating %s with config: %+v", txName, args.Config.Aggregation.Transactions) - agg, err := txmetrics.NewAggregator(txmetrics.AggregatorConfig{ - BatchProcessor: args.BatchProcessor, - MaxTransactionGroups: args.Config.Aggregation.Transactions.MaxTransactionGroups, - MetricsInterval: metricsInterval, - RollUpIntervals: rollUpMetricsIntervals, - MaxTransactionGroupsPerService: int(math.Ceil(0.1 * float64(args.Config.Aggregation.Transactions.MaxTransactionGroups))), - MaxServices: args.Config.Aggregation.Transactions.MaxServices, - HDRHistogramSignificantFigures: args.Config.Aggregation.Transactions.HDRHistogramSignificantFigures, - }) - if err != nil { - return nil, errors.Wrapf(err, "error creating %s", txName) - } - processors = append(processors, namedProcessor{name: txName, processor: agg}) - aggregationMonitoringRegistry.Remove("txmetrics") - monitoring.NewFunc(aggregationMonitoringRegistry, "txmetrics", agg.CollectMonitoring, monitoring.Report) - - const spanName = "service destination metrics aggregation" - args.Logger.Infof("creating %s with config: %+v", spanName, args.Config.Aggregation.ServiceDestinations) - spanAggregator, err := spanmetrics.NewAggregator(spanmetrics.AggregatorConfig{ - BatchProcessor: args.BatchProcessor, - Interval: metricsInterval, - RollUpIntervals: rollUpMetricsIntervals, - MaxGroups: args.Config.Aggregation.ServiceDestinations.MaxGroups, - }) - if err != nil { - return nil, errors.Wrapf(err, "error creating %s", spanName) - } - processors = append(processors, namedProcessor{name: spanName, processor: spanAggregator}) - aggregationMonitoringRegistry.Remove("spanmetrics") - monitoring.NewFunc( - aggregationMonitoringRegistry, - "spanmetrics", - spanAggregator.CollectMonitoring, - monitoring.Report, + var processors []namedProcessor + + name := "LSM aggregator" + agg, err := aggregation.New( + args.Config.Aggregation.MaxServices, + args.Config.Aggregation.Transactions.MaxGroups, + args.Config.Aggregation.ServiceTransactions.MaxGroups, + args.Config.Aggregation.ServiceDestinations.MaxGroups, + args.BatchProcessor, + args.Logger, ) - - const serviceTxName = "service transaction metrics aggregation" - args.Logger.Infof("creating %s with config: %+v", serviceTxName, args.Config.Aggregation.ServiceTransactions) - serviceTxAggregator, err := servicetxmetrics.NewAggregator(servicetxmetrics.AggregatorConfig{ - BatchProcessor: args.BatchProcessor, - Interval: metricsInterval, - RollUpIntervals: rollUpMetricsIntervals, - MaxGroups: args.Config.Aggregation.ServiceTransactions.MaxGroups, - HDRHistogramSignificantFigures: args.Config.Aggregation.ServiceTransactions.HDRHistogramSignificantFigures, - }) - if err != nil { - return nil, errors.Wrapf(err, "error creating %s", serviceTxName) - } - processors = append(processors, namedProcessor{name: serviceTxName, processor: serviceTxAggregator}) - aggregationMonitoringRegistry.Remove("servicetxmetrics") - monitoring.NewFunc( - aggregationMonitoringRegistry, - "servicetxmetrics", - serviceTxAggregator.CollectMonitoring, - monitoring.Report, - ) - - const serviceSummaryName = "service summary metrics aggregation" - args.Logger.Infof("creating %s with config: %+v", serviceSummaryName, args.Config.Aggregation.ServiceTransactions) - serviceSummaryAggregator, err := servicesummarymetrics.NewAggregator(servicesummarymetrics.AggregatorConfig{ - BatchProcessor: args.BatchProcessor, - Interval: metricsInterval, - RollUpIntervals: rollUpMetricsIntervals, - MaxGroups: args.Config.Aggregation.ServiceTransactions.MaxGroups, - }) if err != nil { - return nil, errors.Wrapf(err, "error creating %s", serviceSummaryName) + return nil, errors.Wrapf(err, "error creating %s", name) } - processors = append(processors, namedProcessor{name: serviceSummaryName, processor: serviceSummaryAggregator}) - aggregationMonitoringRegistry.Remove("servicesummarymetrics") - monitoring.NewFunc( - aggregationMonitoringRegistry, - "servicesummarymetrics", - serviceSummaryAggregator.CollectMonitoring, - monitoring.Report, - ) + processors = append(processors, namedProcessor{name: name, processor: agg}) if args.Config.Sampling.Tail.Enabled { const name = "tail sampler" diff --git a/x-pack/apm-server/main_test.go b/x-pack/apm-server/main_test.go index 77102765379..fad69edc008 100644 --- a/x-pack/apm-server/main_test.go +++ b/x-pack/apm-server/main_test.go @@ -38,16 +38,17 @@ func TestMonitoring(t *testing.T) { cfg := config.DefaultConfig() cfg.Sampling.Tail.Enabled = true cfg.Sampling.Tail.Policies = []config.TailSamplingPolicy{{SampleRate: 0.1}} - // MaxTransactionGroups, MaxServices and MaxGroups are configured based on memory limit. + // MaxServices and MaxGroups are configured based on memory limit. // Overriding here to avoid validation errors. - cfg.Aggregation.Transactions.MaxTransactionGroups = 10000 - cfg.Aggregation.Transactions.MaxServices = 10000 + cfg.Aggregation.MaxServices = 10000 + cfg.Aggregation.Transactions.MaxGroups = 10000 cfg.Aggregation.ServiceTransactions.MaxGroups = 10000 + cfg.Aggregation.ServiceDestinations.MaxGroups = 10000 // Wrap & run the server twice, to ensure metric registration does not panic. runServerError := errors.New("runServer") for i := 0; i < 2; i++ { - var aggregationMonitoringSnapshot, tailSamplingMonitoringSnapshot monitoring.FlatSnapshot + var tailSamplingMonitoringSnapshot monitoring.FlatSnapshot serverParams, runServer, err := wrapServer(beater.ServerParams{ Config: cfg, Logger: logp.NewLogger(""), @@ -56,7 +57,6 @@ func TestMonitoring(t *testing.T) { Namespace: "default", NewElasticsearchClient: elasticsearch.NewClient, }, func(ctx context.Context, args beater.ServerParams) error { - aggregationMonitoringSnapshot = monitoring.CollectFlatSnapshot(aggregationMonitoringRegistry, monitoring.Full, false) tailSamplingMonitoringSnapshot = monitoring.CollectFlatSnapshot(samplingMonitoringRegistry, monitoring.Full, false) return runServerError }) @@ -64,7 +64,6 @@ func TestMonitoring(t *testing.T) { err = runServer(context.Background(), serverParams) assert.Equal(t, runServerError, err) - assert.NotEqual(t, monitoring.MakeFlatSnapshot(), aggregationMonitoringSnapshot) assert.NotEqual(t, monitoring.MakeFlatSnapshot(), tailSamplingMonitoringSnapshot) } }