build(deps): bump github.com/prometheus/client_golang
Bumps [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang) from 1.18.0 to 1.19.0. - [Release notes](https://github.com/prometheus/client_golang/releases) - [Changelog](https://github.com/prometheus/client_golang/blob/main/CHANGELOG.md) - [Commits](https://github.com/prometheus/client_golang/compare/v1.18.0...v1.19.0) --- updated-dependencies: - dependency-name: github.com/prometheus/client_golang dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com>
This commit is contained in:
		
							
								
								
									
										5
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								go.mod
									
									
									
									
									
								
							| @@ -50,7 +50,7 @@ require ( | ||||
| 	github.com/opencontainers/runtime-tools v0.9.1-0.20221107090550-2e043c6bd626 | ||||
| 	github.com/opencontainers/selinux v1.11.0 | ||||
| 	github.com/pelletier/go-toml/v2 v2.1.1 | ||||
| 	github.com/prometheus/client_golang v1.18.0 | ||||
| 	github.com/prometheus/client_golang v1.19.0 | ||||
| 	github.com/sirupsen/logrus v1.9.3 | ||||
| 	github.com/stretchr/testify v1.8.4 | ||||
| 	github.com/tchap/go-patricia/v2 v2.3.1 | ||||
| @@ -103,7 +103,6 @@ require ( | ||||
| 	github.com/hashicorp/errwrap v1.1.0 // indirect | ||||
| 	github.com/json-iterator/go v1.1.12 // indirect | ||||
| 	github.com/klauspost/cpuid/v2 v2.2.5 // indirect | ||||
| 	github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect | ||||
| 	github.com/mdlayher/socket v0.4.1 // indirect | ||||
| 	github.com/moby/spdystream v0.2.0 // indirect | ||||
| 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect | ||||
| @@ -112,7 +111,7 @@ require ( | ||||
| 	github.com/pkg/errors v0.9.1 // indirect | ||||
| 	github.com/pmezard/go-difflib v1.0.0 // indirect | ||||
| 	github.com/prometheus/client_model v0.5.0 // indirect | ||||
| 	github.com/prometheus/common v0.45.0 // indirect | ||||
| 	github.com/prometheus/common v0.48.0 // indirect | ||||
| 	github.com/prometheus/procfs v0.12.0 // indirect | ||||
| 	github.com/russross/blackfriday/v2 v2.1.0 // indirect | ||||
| 	github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 // indirect | ||||
|   | ||||
							
								
								
									
										10
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								go.sum
									
									
									
									
									
								
							| @@ -281,8 +281,6 @@ github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= | ||||
| github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= | ||||
| github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= | ||||
| github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= | ||||
| github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= | ||||
| github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= | ||||
| github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U= | ||||
| github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA= | ||||
| github.com/mdlayher/vsock v1.2.1 h1:pC1mTJTvjo1r9n9fbm7S1j04rCgCzhCOS5DY0zqHlnQ= | ||||
| @@ -353,8 +351,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN | ||||
| github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= | ||||
| github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= | ||||
| github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= | ||||
| github.com/prometheus/client_golang v1.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= | ||||
| github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= | ||||
| github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= | ||||
| github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= | ||||
| github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= | ||||
| github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= | ||||
| github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= | ||||
| @@ -362,8 +360,8 @@ github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cY | ||||
| github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= | ||||
| github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= | ||||
| github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= | ||||
| github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= | ||||
| github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= | ||||
| github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= | ||||
| github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= | ||||
| github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= | ||||
| github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= | ||||
| github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= | ||||
|   | ||||
							
								
								
									
										201
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										201
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,201 +0,0 @@ | ||||
|                                  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. | ||||
							
								
								
									
										1
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/NOTICE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/NOTICE
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1 +0,0 @@ | ||||
| Copyright 2012 Matt T. Proud (matt.proud@gmail.com) | ||||
							
								
								
									
										1
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/.gitignore
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1 +0,0 @@ | ||||
| cover.dat | ||||
							
								
								
									
										7
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/Makefile
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/Makefile
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,7 +0,0 @@ | ||||
| all: | ||||
|  | ||||
| cover: | ||||
| 	go test -cover -v -coverprofile=cover.dat ./... | ||||
| 	go tool cover -func cover.dat | ||||
|  | ||||
| .PHONY: cover | ||||
							
								
								
									
										81
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/decode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										81
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/decode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,81 +0,0 @@ | ||||
| // Copyright 2013 Matt T. Proud | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package pbutil | ||||
|  | ||||
| import ( | ||||
| 	"encoding/binary" | ||||
| 	"errors" | ||||
| 	"io" | ||||
|  | ||||
| 	"google.golang.org/protobuf/proto" | ||||
| ) | ||||
|  | ||||
| // TODO: Give error package name prefix in next minor release. | ||||
| var errInvalidVarint = errors.New("invalid varint32 encountered") | ||||
|  | ||||
| // ReadDelimited decodes a message from the provided length-delimited stream, | ||||
| // where the length is encoded as 32-bit varint prefix to the message body. | ||||
| // It returns the total number of bytes read and any applicable error.  This is | ||||
| // roughly equivalent to the companion Java API's | ||||
| // MessageLite#parseDelimitedFrom.  As per the reader contract, this function | ||||
| // calls r.Read repeatedly as required until exactly one message including its | ||||
| // prefix is read and decoded (or an error has occurred).  The function never | ||||
| // reads more bytes from the stream than required.  The function never returns | ||||
| // an error if a message has been read and decoded correctly, even if the end | ||||
| // of the stream has been reached in doing so.  In that case, any subsequent | ||||
| // calls return (0, io.EOF). | ||||
| func ReadDelimited(r io.Reader, m proto.Message) (n int, err error) { | ||||
| 	// TODO: Consider allowing the caller to specify a decode buffer in the | ||||
| 	// next major version. | ||||
|  | ||||
| 	// TODO: Consider using error wrapping to annotate error state in pass- | ||||
| 	// through cases in the next minor version. | ||||
|  | ||||
| 	// Per AbstractParser#parsePartialDelimitedFrom with | ||||
| 	// CodedInputStream#readRawVarint32. | ||||
| 	var headerBuf [binary.MaxVarintLen32]byte | ||||
| 	var bytesRead, varIntBytes int | ||||
| 	var messageLength uint64 | ||||
| 	for varIntBytes == 0 { // i.e. no varint has been decoded yet. | ||||
| 		if bytesRead >= len(headerBuf) { | ||||
| 			return bytesRead, errInvalidVarint | ||||
| 		} | ||||
| 		// We have to read byte by byte here to avoid reading more bytes | ||||
| 		// than required. Each read byte is appended to what we have | ||||
| 		// read before. | ||||
| 		newBytesRead, err := r.Read(headerBuf[bytesRead : bytesRead+1]) | ||||
| 		if newBytesRead == 0 { | ||||
| 			if err != nil { | ||||
| 				return bytesRead, err | ||||
| 			} | ||||
| 			// A Reader should not return (0, nil); but if it does, it should | ||||
| 			// be treated as no-op according to the Reader contract. | ||||
| 			continue | ||||
| 		} | ||||
| 		bytesRead += newBytesRead | ||||
| 		// Now present everything read so far to the varint decoder and | ||||
| 		// see if a varint can be decoded already. | ||||
| 		messageLength, varIntBytes = binary.Uvarint(headerBuf[:bytesRead]) | ||||
| 	} | ||||
|  | ||||
| 	messageBuf := make([]byte, messageLength) | ||||
| 	newBytesRead, err := io.ReadFull(r, messageBuf) | ||||
| 	bytesRead += newBytesRead | ||||
| 	if err != nil { | ||||
| 		return bytesRead, err | ||||
| 	} | ||||
|  | ||||
| 	return bytesRead, proto.Unmarshal(messageBuf, m) | ||||
| } | ||||
							
								
								
									
										16
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/doc.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,16 +0,0 @@ | ||||
| // Copyright 2013 Matt T. Proud | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| // Package pbutil provides record length-delimited Protocol Buffer streaming. | ||||
| package pbutil | ||||
							
								
								
									
										49
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/encode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										49
									
								
								vendor/github.com/matttproud/golang_protobuf_extensions/v2/pbutil/encode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,49 +0,0 @@ | ||||
| // Copyright 2013 Matt T. Proud | ||||
| // | ||||
| // 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. | ||||
|  | ||||
| package pbutil | ||||
|  | ||||
| import ( | ||||
| 	"encoding/binary" | ||||
| 	"io" | ||||
|  | ||||
| 	"google.golang.org/protobuf/proto" | ||||
| ) | ||||
|  | ||||
| // WriteDelimited encodes and dumps a message to the provided writer prefixed | ||||
| // with a 32-bit varint indicating the length of the encoded message, producing | ||||
| // a length-delimited record stream, which can be used to chain together | ||||
| // encoded messages of the same type together in a file.  It returns the total | ||||
| // number of bytes written and any applicable error.  This is roughly | ||||
| // equivalent to the companion Java API's MessageLite#writeDelimitedTo. | ||||
| func WriteDelimited(w io.Writer, m proto.Message) (n int, err error) { | ||||
| 	// TODO: Consider allowing the caller to specify an encode buffer in the | ||||
| 	// next major version. | ||||
|  | ||||
| 	buffer, err := proto.Marshal(m) | ||||
| 	if err != nil { | ||||
| 		return 0, err | ||||
| 	} | ||||
|  | ||||
| 	var buf [binary.MaxVarintLen32]byte | ||||
| 	encodedLength := binary.PutUvarint(buf[:], uint64(len(buffer))) | ||||
|  | ||||
| 	sync, err := w.Write(buf[:encodedLength]) | ||||
| 	if err != nil { | ||||
| 		return sync, err | ||||
| 	} | ||||
|  | ||||
| 	n, err = w.Write(buffer) | ||||
| 	return n + sync, err | ||||
| } | ||||
							
								
								
									
										27
									
								
								vendor/github.com/prometheus/common/expfmt/decode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										27
									
								
								vendor/github.com/prometheus/common/expfmt/decode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -14,6 +14,7 @@ | ||||
| package expfmt | ||||
|  | ||||
| import ( | ||||
| 	"bufio" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"math" | ||||
| @@ -21,8 +22,8 @@ import ( | ||||
| 	"net/http" | ||||
|  | ||||
| 	dto "github.com/prometheus/client_model/go" | ||||
| 	"google.golang.org/protobuf/encoding/protodelim" | ||||
|  | ||||
| 	"github.com/matttproud/golang_protobuf_extensions/v2/pbutil" | ||||
| 	"github.com/prometheus/common/model" | ||||
| ) | ||||
|  | ||||
| @@ -44,7 +45,7 @@ func ResponseFormat(h http.Header) Format { | ||||
|  | ||||
| 	mediatype, params, err := mime.ParseMediaType(ct) | ||||
| 	if err != nil { | ||||
| 		return FmtUnknown | ||||
| 		return fmtUnknown | ||||
| 	} | ||||
|  | ||||
| 	const textType = "text/plain" | ||||
| @@ -52,28 +53,28 @@ func ResponseFormat(h http.Header) Format { | ||||
| 	switch mediatype { | ||||
| 	case ProtoType: | ||||
| 		if p, ok := params["proto"]; ok && p != ProtoProtocol { | ||||
| 			return FmtUnknown | ||||
| 			return fmtUnknown | ||||
| 		} | ||||
| 		if e, ok := params["encoding"]; ok && e != "delimited" { | ||||
| 			return FmtUnknown | ||||
| 			return fmtUnknown | ||||
| 		} | ||||
| 		return FmtProtoDelim | ||||
| 		return fmtProtoDelim | ||||
|  | ||||
| 	case textType: | ||||
| 		if v, ok := params["version"]; ok && v != TextVersion { | ||||
| 			return FmtUnknown | ||||
| 			return fmtUnknown | ||||
| 		} | ||||
| 		return FmtText | ||||
| 		return fmtText | ||||
| 	} | ||||
|  | ||||
| 	return FmtUnknown | ||||
| 	return fmtUnknown | ||||
| } | ||||
|  | ||||
| // NewDecoder returns a new decoder based on the given input format. | ||||
| // If the input format does not imply otherwise, a text format decoder is returned. | ||||
| func NewDecoder(r io.Reader, format Format) Decoder { | ||||
| 	switch format { | ||||
| 	case FmtProtoDelim: | ||||
| 	switch format.FormatType() { | ||||
| 	case TypeProtoDelim: | ||||
| 		return &protoDecoder{r: r} | ||||
| 	} | ||||
| 	return &textDecoder{r: r} | ||||
| @@ -86,8 +87,10 @@ type protoDecoder struct { | ||||
|  | ||||
| // Decode implements the Decoder interface. | ||||
| func (d *protoDecoder) Decode(v *dto.MetricFamily) error { | ||||
| 	_, err := pbutil.ReadDelimited(d.r, v) | ||||
| 	if err != nil { | ||||
| 	opts := protodelim.UnmarshalOptions{ | ||||
| 		MaxSize: -1, | ||||
| 	} | ||||
| 	if err := opts.UnmarshalFrom(bufio.NewReader(d.r), v); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if !model.IsValidMetricName(model.LabelValue(v.GetName())) { | ||||
|   | ||||
							
								
								
									
										78
									
								
								vendor/github.com/prometheus/common/expfmt/encode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										78
									
								
								vendor/github.com/prometheus/common/expfmt/encode.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -18,10 +18,12 @@ import ( | ||||
| 	"io" | ||||
| 	"net/http" | ||||
|  | ||||
| 	"github.com/matttproud/golang_protobuf_extensions/v2/pbutil" | ||||
| 	"github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg" | ||||
| 	"google.golang.org/protobuf/encoding/protodelim" | ||||
| 	"google.golang.org/protobuf/encoding/prototext" | ||||
|  | ||||
| 	"github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg" | ||||
| 	"github.com/prometheus/common/model" | ||||
|  | ||||
| 	dto "github.com/prometheus/client_model/go" | ||||
| ) | ||||
|  | ||||
| @@ -60,23 +62,32 @@ func (ec encoderCloser) Close() error { | ||||
| // as the support is still experimental. To include the option to negotiate | ||||
| // FmtOpenMetrics, use NegotiateOpenMetrics. | ||||
| func Negotiate(h http.Header) Format { | ||||
| 	escapingScheme := Format(fmt.Sprintf("; escaping=%s", Format(model.NameEscapingScheme.String()))) | ||||
| 	for _, ac := range goautoneg.ParseAccept(h.Get(hdrAccept)) { | ||||
| 		if escapeParam := ac.Params[model.EscapingKey]; escapeParam != "" { | ||||
| 			switch Format(escapeParam) { | ||||
| 			case model.AllowUTF8, model.EscapeUnderscores, model.EscapeDots, model.EscapeValues: | ||||
| 				escapingScheme = Format(fmt.Sprintf("; escaping=%s", escapeParam)) | ||||
| 			default: | ||||
| 				// If the escaping parameter is unknown, ignore it. | ||||
| 			} | ||||
| 		} | ||||
| 		ver := ac.Params["version"] | ||||
| 		if ac.Type+"/"+ac.SubType == ProtoType && ac.Params["proto"] == ProtoProtocol { | ||||
| 			switch ac.Params["encoding"] { | ||||
| 			case "delimited": | ||||
| 				return FmtProtoDelim | ||||
| 				return fmtProtoDelim + escapingScheme | ||||
| 			case "text": | ||||
| 				return FmtProtoText | ||||
| 				return fmtProtoText + escapingScheme | ||||
| 			case "compact-text": | ||||
| 				return FmtProtoCompact | ||||
| 				return fmtProtoCompact + escapingScheme | ||||
| 			} | ||||
| 		} | ||||
| 		if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") { | ||||
| 			return FmtText | ||||
| 			return fmtText + escapingScheme | ||||
| 		} | ||||
| 	} | ||||
| 	return FmtText | ||||
| 	return fmtText + escapingScheme | ||||
| } | ||||
|  | ||||
| // NegotiateIncludingOpenMetrics works like Negotiate but includes | ||||
| @@ -84,29 +95,40 @@ func Negotiate(h http.Header) Format { | ||||
| // temporary and will disappear once FmtOpenMetrics is fully supported and as | ||||
| // such may be negotiated by the normal Negotiate function. | ||||
| func NegotiateIncludingOpenMetrics(h http.Header) Format { | ||||
| 	escapingScheme := Format(fmt.Sprintf("; escaping=%s", Format(model.NameEscapingScheme.String()))) | ||||
| 	for _, ac := range goautoneg.ParseAccept(h.Get(hdrAccept)) { | ||||
| 		if escapeParam := ac.Params[model.EscapingKey]; escapeParam != "" { | ||||
| 			switch Format(escapeParam) { | ||||
| 			case model.AllowUTF8, model.EscapeUnderscores, model.EscapeDots, model.EscapeValues: | ||||
| 				escapingScheme = Format(fmt.Sprintf("; escaping=%s", escapeParam)) | ||||
| 			default: | ||||
| 				// If the escaping parameter is unknown, ignore it. | ||||
| 			} | ||||
| 		} | ||||
| 		ver := ac.Params["version"] | ||||
| 		if ac.Type+"/"+ac.SubType == ProtoType && ac.Params["proto"] == ProtoProtocol { | ||||
| 			switch ac.Params["encoding"] { | ||||
| 			case "delimited": | ||||
| 				return FmtProtoDelim | ||||
| 				return fmtProtoDelim + escapingScheme | ||||
| 			case "text": | ||||
| 				return FmtProtoText | ||||
| 				return fmtProtoText + escapingScheme | ||||
| 			case "compact-text": | ||||
| 				return FmtProtoCompact | ||||
| 				return fmtProtoCompact + escapingScheme | ||||
| 			} | ||||
| 		} | ||||
| 		if ac.Type == "text" && ac.SubType == "plain" && (ver == TextVersion || ver == "") { | ||||
| 			return FmtText | ||||
| 			return fmtText + escapingScheme | ||||
| 		} | ||||
| 		if ac.Type+"/"+ac.SubType == OpenMetricsType && (ver == OpenMetricsVersion_0_0_1 || ver == OpenMetricsVersion_1_0_0 || ver == "") { | ||||
| 			if ver == OpenMetricsVersion_1_0_0 { | ||||
| 				return FmtOpenMetrics_1_0_0 | ||||
| 			switch ver { | ||||
| 			case OpenMetricsVersion_1_0_0: | ||||
| 				return fmtOpenMetrics_1_0_0 + escapingScheme | ||||
| 			default: | ||||
| 				return fmtOpenMetrics_0_0_1 + escapingScheme | ||||
| 			} | ||||
| 			return FmtOpenMetrics_0_0_1 | ||||
| 		} | ||||
| 	} | ||||
| 	return FmtText | ||||
| 	return fmtText + escapingScheme | ||||
| } | ||||
|  | ||||
| // NewEncoder returns a new encoder based on content type negotiation. All | ||||
| @@ -115,44 +137,48 @@ func NegotiateIncludingOpenMetrics(h http.Header) Format { | ||||
| // for FmtOpenMetrics, but a future (breaking) release will add the Close method | ||||
| // to the Encoder interface directly. The current version of the Encoder | ||||
| // interface is kept for backwards compatibility. | ||||
| // In cases where the Format does not allow for UTF-8 names, the global | ||||
| // NameEscapingScheme will be applied. | ||||
| func NewEncoder(w io.Writer, format Format) Encoder { | ||||
| 	switch format { | ||||
| 	case FmtProtoDelim: | ||||
| 	escapingScheme := format.ToEscapingScheme() | ||||
|  | ||||
| 	switch format.FormatType() { | ||||
| 	case TypeProtoDelim: | ||||
| 		return encoderCloser{ | ||||
| 			encode: func(v *dto.MetricFamily) error { | ||||
| 				_, err := pbutil.WriteDelimited(w, v) | ||||
| 				_, err := protodelim.MarshalTo(w, v) | ||||
| 				return err | ||||
| 			}, | ||||
| 			close: func() error { return nil }, | ||||
| 		} | ||||
| 	case FmtProtoCompact: | ||||
| 	case TypeProtoCompact: | ||||
| 		return encoderCloser{ | ||||
| 			encode: func(v *dto.MetricFamily) error { | ||||
| 				_, err := fmt.Fprintln(w, v.String()) | ||||
| 				_, err := fmt.Fprintln(w, model.EscapeMetricFamily(v, escapingScheme).String()) | ||||
| 				return err | ||||
| 			}, | ||||
| 			close: func() error { return nil }, | ||||
| 		} | ||||
| 	case FmtProtoText: | ||||
| 	case TypeProtoText: | ||||
| 		return encoderCloser{ | ||||
| 			encode: func(v *dto.MetricFamily) error { | ||||
| 				_, err := fmt.Fprintln(w, prototext.Format(v)) | ||||
| 				_, err := fmt.Fprintln(w, prototext.Format(model.EscapeMetricFamily(v, escapingScheme))) | ||||
| 				return err | ||||
| 			}, | ||||
| 			close: func() error { return nil }, | ||||
| 		} | ||||
| 	case FmtText: | ||||
| 	case TypeTextPlain: | ||||
| 		return encoderCloser{ | ||||
| 			encode: func(v *dto.MetricFamily) error { | ||||
| 				_, err := MetricFamilyToText(w, v) | ||||
| 				_, err := MetricFamilyToText(w, model.EscapeMetricFamily(v, escapingScheme)) | ||||
| 				return err | ||||
| 			}, | ||||
| 			close: func() error { return nil }, | ||||
| 		} | ||||
| 	case FmtOpenMetrics_0_0_1, FmtOpenMetrics_1_0_0: | ||||
| 	case TypeOpenMetrics: | ||||
| 		return encoderCloser{ | ||||
| 			encode: func(v *dto.MetricFamily) error { | ||||
| 				_, err := MetricFamilyToOpenMetrics(w, v) | ||||
| 				_, err := MetricFamilyToOpenMetrics(w, model.EscapeMetricFamily(v, escapingScheme)) | ||||
| 				return err | ||||
| 			}, | ||||
| 			close: func() error { | ||||
|   | ||||
							
								
								
									
										144
									
								
								vendor/github.com/prometheus/common/expfmt/expfmt.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										144
									
								
								vendor/github.com/prometheus/common/expfmt/expfmt.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -14,30 +14,154 @@ | ||||
| // Package expfmt contains tools for reading and writing Prometheus metrics. | ||||
| package expfmt | ||||
|  | ||||
| import ( | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/prometheus/common/model" | ||||
| ) | ||||
|  | ||||
| // Format specifies the HTTP content type of the different wire protocols. | ||||
| type Format string | ||||
|  | ||||
| // Constants to assemble the Content-Type values for the different wire protocols. | ||||
| // Constants to assemble the Content-Type values for the different wire | ||||
| // protocols. The Content-Type strings here are all for the legacy exposition | ||||
| // formats, where valid characters for metric names and label names are limited. | ||||
| // Support for arbitrary UTF-8 characters in those names is already partially | ||||
| // implemented in this module (see model.ValidationScheme), but to actually use | ||||
| // it on the wire, new content-type strings will have to be agreed upon and | ||||
| // added here. | ||||
| const ( | ||||
| 	TextVersion              = "0.0.4" | ||||
| 	ProtoType                = `application/vnd.google.protobuf` | ||||
| 	ProtoProtocol            = `io.prometheus.client.MetricFamily` | ||||
| 	ProtoFmt                 = ProtoType + "; proto=" + ProtoProtocol + ";" | ||||
| 	protoFmt                 = ProtoType + "; proto=" + ProtoProtocol + ";" | ||||
| 	OpenMetricsType          = `application/openmetrics-text` | ||||
| 	OpenMetricsVersion_0_0_1 = "0.0.1" | ||||
| 	OpenMetricsVersion_1_0_0 = "1.0.0" | ||||
|  | ||||
| 	// The Content-Type values for the different wire protocols. | ||||
| 	FmtUnknown           Format = `<unknown>` | ||||
| 	FmtText              Format = `text/plain; version=` + TextVersion + `; charset=utf-8` | ||||
| 	FmtProtoDelim        Format = ProtoFmt + ` encoding=delimited` | ||||
| 	FmtProtoText         Format = ProtoFmt + ` encoding=text` | ||||
| 	FmtProtoCompact      Format = ProtoFmt + ` encoding=compact-text` | ||||
| 	FmtOpenMetrics_1_0_0 Format = OpenMetricsType + `; version=` + OpenMetricsVersion_1_0_0 + `; charset=utf-8` | ||||
| 	FmtOpenMetrics_0_0_1 Format = OpenMetricsType + `; version=` + OpenMetricsVersion_0_0_1 + `; charset=utf-8` | ||||
| 	// The Content-Type values for the different wire protocols. Note that these | ||||
| 	// values are now unexported. If code was relying on comparisons to these | ||||
| 	// constants, instead use FormatType(). | ||||
| 	fmtUnknown           Format = `<unknown>` | ||||
| 	fmtText              Format = `text/plain; version=` + TextVersion + `; charset=utf-8` | ||||
| 	fmtProtoDelim        Format = protoFmt + ` encoding=delimited` | ||||
| 	fmtProtoText         Format = protoFmt + ` encoding=text` | ||||
| 	fmtProtoCompact      Format = protoFmt + ` encoding=compact-text` | ||||
| 	fmtOpenMetrics_1_0_0 Format = OpenMetricsType + `; version=` + OpenMetricsVersion_1_0_0 + `; charset=utf-8` | ||||
| 	fmtOpenMetrics_0_0_1 Format = OpenMetricsType + `; version=` + OpenMetricsVersion_0_0_1 + `; charset=utf-8` | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	hdrContentType = "Content-Type" | ||||
| 	hdrAccept      = "Accept" | ||||
| ) | ||||
|  | ||||
| // FormatType is a Go enum representing the overall category for the given | ||||
| // Format. As the number of Format permutations increases, doing basic string | ||||
| // comparisons are not feasible, so this enum captures the most useful | ||||
| // high-level attribute of the Format string. | ||||
| type FormatType int | ||||
|  | ||||
| const ( | ||||
| 	TypeUnknown = iota | ||||
| 	TypeProtoCompact | ||||
| 	TypeProtoDelim | ||||
| 	TypeProtoText | ||||
| 	TypeTextPlain | ||||
| 	TypeOpenMetrics | ||||
| ) | ||||
|  | ||||
| // NewFormat generates a new Format from the type provided. Mostly used for | ||||
| // tests, most Formats should be generated as part of content negotiation in | ||||
| // encode.go. | ||||
| func NewFormat(t FormatType) Format { | ||||
| 	switch t { | ||||
| 	case TypeProtoCompact: | ||||
| 		return fmtProtoCompact | ||||
| 	case TypeProtoDelim: | ||||
| 		return fmtProtoDelim | ||||
| 	case TypeProtoText: | ||||
| 		return fmtProtoText | ||||
| 	case TypeTextPlain: | ||||
| 		return fmtText | ||||
| 	case TypeOpenMetrics: | ||||
| 		return fmtOpenMetrics_1_0_0 | ||||
| 	default: | ||||
| 		return fmtUnknown | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // FormatType deduces an overall FormatType for the given format. | ||||
| func (f Format) FormatType() FormatType { | ||||
| 	toks := strings.Split(string(f), ";") | ||||
| 	if len(toks) < 2 { | ||||
| 		return TypeUnknown | ||||
| 	} | ||||
|  | ||||
| 	params := make(map[string]string) | ||||
| 	for i, t := range toks { | ||||
| 		if i == 0 { | ||||
| 			continue | ||||
| 		} | ||||
| 		args := strings.Split(t, "=") | ||||
| 		if len(args) != 2 { | ||||
| 			continue | ||||
| 		} | ||||
| 		params[strings.TrimSpace(args[0])] = strings.TrimSpace(args[1]) | ||||
| 	} | ||||
|  | ||||
| 	switch strings.TrimSpace(toks[0]) { | ||||
| 	case ProtoType: | ||||
| 		if params["proto"] != ProtoProtocol { | ||||
| 			return TypeUnknown | ||||
| 		} | ||||
| 		switch params["encoding"] { | ||||
| 		case "delimited": | ||||
| 			return TypeProtoDelim | ||||
| 		case "text": | ||||
| 			return TypeProtoText | ||||
| 		case "compact-text": | ||||
| 			return TypeProtoCompact | ||||
| 		default: | ||||
| 			return TypeUnknown | ||||
| 		} | ||||
| 	case OpenMetricsType: | ||||
| 		if params["charset"] != "utf-8" { | ||||
| 			return TypeUnknown | ||||
| 		} | ||||
| 		return TypeOpenMetrics | ||||
| 	case "text/plain": | ||||
| 		v, ok := params["version"] | ||||
| 		if !ok { | ||||
| 			return TypeTextPlain | ||||
| 		} | ||||
| 		if v == TextVersion { | ||||
| 			return TypeTextPlain | ||||
| 		} | ||||
| 		return TypeUnknown | ||||
| 	default: | ||||
| 		return TypeUnknown | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ToEscapingScheme returns an EscapingScheme depending on the Format. Iff the | ||||
| // Format contains a escaping=allow-utf-8 term, it will select NoEscaping. If a valid | ||||
| // "escaping" term exists, that will be used. Otherwise, the global default will | ||||
| // be returned. | ||||
| func (format Format) ToEscapingScheme() model.EscapingScheme { | ||||
| 	for _, p := range strings.Split(string(format), ";") { | ||||
| 		toks := strings.Split(p, "=") | ||||
| 		if len(toks) != 2 { | ||||
| 			continue | ||||
| 		} | ||||
| 		key, value := strings.TrimSpace(toks[0]), strings.TrimSpace(toks[1]) | ||||
| 		if key == model.EscapingKey { | ||||
| 			scheme, err := model.ToEscapingScheme(value) | ||||
| 			if err != nil { | ||||
| 				return model.NameEscapingScheme | ||||
| 			} | ||||
| 			return scheme | ||||
| 		} | ||||
| 	} | ||||
| 	return model.NameEscapingScheme | ||||
| } | ||||
|   | ||||
							
								
								
									
										85
									
								
								vendor/github.com/prometheus/common/expfmt/openmetrics_create.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										85
									
								
								vendor/github.com/prometheus/common/expfmt/openmetrics_create.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -35,6 +35,18 @@ import ( | ||||
| // sanity checks. If the input contains duplicate metrics or invalid metric or | ||||
| // label names, the conversion will result in invalid text format output. | ||||
| // | ||||
| // If metric names conform to the legacy validation pattern, they will be placed | ||||
| // outside the brackets in the traditional way, like `foo{}`. If the metric name | ||||
| // fails the legacy validation check, it will be placed quoted inside the | ||||
| // brackets: `{"foo"}`. As stated above, the input is assumed to be santized and | ||||
| // no error will be thrown in this case. | ||||
| // | ||||
| // Similar to metric names, if label names conform to the legacy validation | ||||
| // pattern, they will be unquoted as normal, like `foo{bar="baz"}`. If the label | ||||
| // name fails the legacy validation check, it will be quoted: | ||||
| // `foo{"bar"="baz"}`. As stated above, the input is assumed to be santized and | ||||
| // no error will be thrown in this case. | ||||
| // | ||||
| // This function fulfills the type 'expfmt.encoder'. | ||||
| // | ||||
| // Note that OpenMetrics requires a final `# EOF` line. Since this function acts | ||||
| @@ -98,7 +110,7 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily) (written int | ||||
| 		if err != nil { | ||||
| 			return | ||||
| 		} | ||||
| 		n, err = w.WriteString(shortName) | ||||
| 		n, err = writeName(w, shortName) | ||||
| 		written += n | ||||
| 		if err != nil { | ||||
| 			return | ||||
| @@ -124,7 +136,7 @@ func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily) (written int | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	n, err = w.WriteString(shortName) | ||||
| 	n, err = writeName(w, shortName) | ||||
| 	written += n | ||||
| 	if err != nil { | ||||
| 		return | ||||
| @@ -303,21 +315,9 @@ func writeOpenMetricsSample( | ||||
| 	floatValue float64, intValue uint64, useIntValue bool, | ||||
| 	exemplar *dto.Exemplar, | ||||
| ) (int, error) { | ||||
| 	var written int | ||||
| 	n, err := w.WriteString(name) | ||||
| 	written += n | ||||
| 	if err != nil { | ||||
| 		return written, err | ||||
| 	} | ||||
| 	if suffix != "" { | ||||
| 		n, err = w.WriteString(suffix) | ||||
| 		written += n | ||||
| 		if err != nil { | ||||
| 			return written, err | ||||
| 		} | ||||
| 	} | ||||
| 	n, err = writeOpenMetricsLabelPairs( | ||||
| 		w, metric.Label, additionalLabelName, additionalLabelValue, | ||||
| 	written := 0 | ||||
| 	n, err := writeOpenMetricsNameAndLabelPairs( | ||||
| 		w, name+suffix, metric.Label, additionalLabelName, additionalLabelValue, | ||||
| 	) | ||||
| 	written += n | ||||
| 	if err != nil { | ||||
| @@ -365,27 +365,58 @@ func writeOpenMetricsSample( | ||||
| 	return written, nil | ||||
| } | ||||
|  | ||||
| // writeOpenMetricsLabelPairs works like writeOpenMetrics but formats the float | ||||
| // in OpenMetrics style. | ||||
| func writeOpenMetricsLabelPairs( | ||||
| // writeOpenMetricsNameAndLabelPairs works like writeOpenMetricsSample but | ||||
| // formats the float in OpenMetrics style. | ||||
| func writeOpenMetricsNameAndLabelPairs( | ||||
| 	w enhancedWriter, | ||||
| 	name string, | ||||
| 	in []*dto.LabelPair, | ||||
| 	additionalLabelName string, additionalLabelValue float64, | ||||
| ) (int, error) { | ||||
| 	if len(in) == 0 && additionalLabelName == "" { | ||||
| 		return 0, nil | ||||
| 	} | ||||
| 	var ( | ||||
| 		written   int | ||||
| 		separator byte = '{' | ||||
| 		written            int | ||||
| 		separator          byte = '{' | ||||
| 		metricInsideBraces      = false | ||||
| 	) | ||||
|  | ||||
| 	if name != "" { | ||||
| 		// If the name does not pass the legacy validity check, we must put the | ||||
| 		// metric name inside the braces, quoted. | ||||
| 		if !model.IsValidLegacyMetricName(model.LabelValue(name)) { | ||||
| 			metricInsideBraces = true | ||||
| 			err := w.WriteByte(separator) | ||||
| 			written++ | ||||
| 			if err != nil { | ||||
| 				return written, err | ||||
| 			} | ||||
| 			separator = ',' | ||||
| 		} | ||||
|  | ||||
| 		n, err := writeName(w, name) | ||||
| 		written += n | ||||
| 		if err != nil { | ||||
| 			return written, err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if len(in) == 0 && additionalLabelName == "" { | ||||
| 		if metricInsideBraces { | ||||
| 			err := w.WriteByte('}') | ||||
| 			written++ | ||||
| 			if err != nil { | ||||
| 				return written, err | ||||
| 			} | ||||
| 		} | ||||
| 		return written, nil | ||||
| 	} | ||||
|  | ||||
| 	for _, lp := range in { | ||||
| 		err := w.WriteByte(separator) | ||||
| 		written++ | ||||
| 		if err != nil { | ||||
| 			return written, err | ||||
| 		} | ||||
| 		n, err := w.WriteString(lp.GetName()) | ||||
| 		n, err := writeName(w, lp.GetName()) | ||||
| 		written += n | ||||
| 		if err != nil { | ||||
| 			return written, err | ||||
| @@ -451,7 +482,7 @@ func writeExemplar(w enhancedWriter, e *dto.Exemplar) (int, error) { | ||||
| 	if err != nil { | ||||
| 		return written, err | ||||
| 	} | ||||
| 	n, err = writeOpenMetricsLabelPairs(w, e.Label, "", 0) | ||||
| 	n, err = writeOpenMetricsNameAndLabelPairs(w, "", e.Label, "", 0) | ||||
| 	written += n | ||||
| 	if err != nil { | ||||
| 		return written, err | ||||
|   | ||||
							
								
								
									
										118
									
								
								vendor/github.com/prometheus/common/expfmt/text_create.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										118
									
								
								vendor/github.com/prometheus/common/expfmt/text_create.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -62,6 +62,18 @@ var ( | ||||
| // contains duplicate metrics or invalid metric or label names, the conversion | ||||
| // will result in invalid text format output. | ||||
| // | ||||
| // If metric names conform to the legacy validation pattern, they will be placed | ||||
| // outside the brackets in the traditional way, like `foo{}`. If the metric name | ||||
| // fails the legacy validation check, it will be placed quoted inside the | ||||
| // brackets: `{"foo"}`. As stated above, the input is assumed to be santized and | ||||
| // no error will be thrown in this case. | ||||
| // | ||||
| // Similar to metric names, if label names conform to the legacy validation | ||||
| // pattern, they will be unquoted as normal, like `foo{bar="baz"}`. If the label | ||||
| // name fails the legacy validation check, it will be quoted: | ||||
| // `foo{"bar"="baz"}`. As stated above, the input is assumed to be santized and | ||||
| // no error will be thrown in this case. | ||||
| // | ||||
| // This method fulfills the type 'prometheus.encoder'. | ||||
| func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err error) { | ||||
| 	// Fail-fast checks. | ||||
| @@ -98,7 +110,7 @@ func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err e | ||||
| 		if err != nil { | ||||
| 			return | ||||
| 		} | ||||
| 		n, err = w.WriteString(name) | ||||
| 		n, err = writeName(w, name) | ||||
| 		written += n | ||||
| 		if err != nil { | ||||
| 			return | ||||
| @@ -124,7 +136,7 @@ func MetricFamilyToText(out io.Writer, in *dto.MetricFamily) (written int, err e | ||||
| 	if err != nil { | ||||
| 		return | ||||
| 	} | ||||
| 	n, err = w.WriteString(name) | ||||
| 	n, err = writeName(w, name) | ||||
| 	written += n | ||||
| 	if err != nil { | ||||
| 		return | ||||
| @@ -280,21 +292,9 @@ func writeSample( | ||||
| 	additionalLabelName string, additionalLabelValue float64, | ||||
| 	value float64, | ||||
| ) (int, error) { | ||||
| 	var written int | ||||
| 	n, err := w.WriteString(name) | ||||
| 	written += n | ||||
| 	if err != nil { | ||||
| 		return written, err | ||||
| 	} | ||||
| 	if suffix != "" { | ||||
| 		n, err = w.WriteString(suffix) | ||||
| 		written += n | ||||
| 		if err != nil { | ||||
| 			return written, err | ||||
| 		} | ||||
| 	} | ||||
| 	n, err = writeLabelPairs( | ||||
| 		w, metric.Label, additionalLabelName, additionalLabelValue, | ||||
| 	written := 0 | ||||
| 	n, err := writeNameAndLabelPairs( | ||||
| 		w, name+suffix, metric.Label, additionalLabelName, additionalLabelValue, | ||||
| 	) | ||||
| 	written += n | ||||
| 	if err != nil { | ||||
| @@ -330,32 +330,64 @@ func writeSample( | ||||
| 	return written, nil | ||||
| } | ||||
|  | ||||
| // writeLabelPairs converts a slice of LabelPair proto messages plus the | ||||
| // explicitly given additional label pair into text formatted as required by the | ||||
| // text format and writes it to 'w'. An empty slice in combination with an empty | ||||
| // string 'additionalLabelName' results in nothing being written. Otherwise, the | ||||
| // label pairs are written, escaped as required by the text format, and enclosed | ||||
| // in '{...}'. The function returns the number of bytes written and any error | ||||
| // encountered. | ||||
| func writeLabelPairs( | ||||
| // writeNameAndLabelPairs converts a slice of LabelPair proto messages plus the | ||||
| // explicitly given metric name and additional label pair into text formatted as | ||||
| // required by the text format and writes it to 'w'. An empty slice in | ||||
| // combination with an empty string 'additionalLabelName' results in nothing | ||||
| // being written. Otherwise, the label pairs are written, escaped as required by | ||||
| // the text format, and enclosed in '{...}'. The function returns the number of | ||||
| // bytes written and any error encountered. If the metric name is not | ||||
| // legacy-valid, it will be put inside the brackets as well. Legacy-invalid | ||||
| // label names will also be quoted. | ||||
| func writeNameAndLabelPairs( | ||||
| 	w enhancedWriter, | ||||
| 	name string, | ||||
| 	in []*dto.LabelPair, | ||||
| 	additionalLabelName string, additionalLabelValue float64, | ||||
| ) (int, error) { | ||||
| 	if len(in) == 0 && additionalLabelName == "" { | ||||
| 		return 0, nil | ||||
| 	} | ||||
| 	var ( | ||||
| 		written   int | ||||
| 		separator byte = '{' | ||||
| 		written            int | ||||
| 		separator          byte = '{' | ||||
| 		metricInsideBraces      = false | ||||
| 	) | ||||
|  | ||||
| 	if name != "" { | ||||
| 		// If the name does not pass the legacy validity check, we must put the | ||||
| 		// metric name inside the braces. | ||||
| 		if !model.IsValidLegacyMetricName(model.LabelValue(name)) { | ||||
| 			metricInsideBraces = true | ||||
| 			err := w.WriteByte(separator) | ||||
| 			written++ | ||||
| 			if err != nil { | ||||
| 				return written, err | ||||
| 			} | ||||
| 			separator = ',' | ||||
| 		} | ||||
| 		n, err := writeName(w, name) | ||||
| 		written += n | ||||
| 		if err != nil { | ||||
| 			return written, err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if len(in) == 0 && additionalLabelName == "" { | ||||
| 		if metricInsideBraces { | ||||
| 			err := w.WriteByte('}') | ||||
| 			written++ | ||||
| 			if err != nil { | ||||
| 				return written, err | ||||
| 			} | ||||
| 		} | ||||
| 		return written, nil | ||||
| 	} | ||||
|  | ||||
| 	for _, lp := range in { | ||||
| 		err := w.WriteByte(separator) | ||||
| 		written++ | ||||
| 		if err != nil { | ||||
| 			return written, err | ||||
| 		} | ||||
| 		n, err := w.WriteString(lp.GetName()) | ||||
| 		n, err := writeName(w, lp.GetName()) | ||||
| 		written += n | ||||
| 		if err != nil { | ||||
| 			return written, err | ||||
| @@ -462,3 +494,27 @@ func writeInt(w enhancedWriter, i int64) (int, error) { | ||||
| 	numBufPool.Put(bp) | ||||
| 	return written, err | ||||
| } | ||||
|  | ||||
| // writeName writes a string as-is if it complies with the legacy naming | ||||
| // scheme, or escapes it in double quotes if not. | ||||
| func writeName(w enhancedWriter, name string) (int, error) { | ||||
| 	if model.IsValidLegacyMetricName(model.LabelValue(name)) { | ||||
| 		return w.WriteString(name) | ||||
| 	} | ||||
| 	var written int | ||||
| 	var err error | ||||
| 	err = w.WriteByte('"') | ||||
| 	written++ | ||||
| 	if err != nil { | ||||
| 		return written, err | ||||
| 	} | ||||
| 	var n int | ||||
| 	n, err = writeEscapedString(w, name, true) | ||||
| 	written += n | ||||
| 	if err != nil { | ||||
| 		return written, err | ||||
| 	} | ||||
| 	err = w.WriteByte('"') | ||||
| 	written++ | ||||
| 	return written, err | ||||
| } | ||||
|   | ||||
							
								
								
									
										8
									
								
								vendor/github.com/prometheus/common/expfmt/text_parse.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/prometheus/common/expfmt/text_parse.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -16,6 +16,7 @@ package expfmt | ||||
| import ( | ||||
| 	"bufio" | ||||
| 	"bytes" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"math" | ||||
| @@ -24,8 +25,9 @@ import ( | ||||
|  | ||||
| 	dto "github.com/prometheus/client_model/go" | ||||
|  | ||||
| 	"github.com/prometheus/common/model" | ||||
| 	"google.golang.org/protobuf/proto" | ||||
|  | ||||
| 	"github.com/prometheus/common/model" | ||||
| ) | ||||
|  | ||||
| // A stateFn is a function that represents a state in a state machine. By | ||||
| @@ -112,7 +114,7 @@ func (p *TextParser) TextToMetricFamilies(in io.Reader) (map[string]*dto.MetricF | ||||
| 	// stream. Turn this error into something nicer and more | ||||
| 	// meaningful. (io.EOF is often used as a signal for the legitimate end | ||||
| 	// of an input stream.) | ||||
| 	if p.err == io.EOF { | ||||
| 	if p.err != nil && errors.Is(p.err, io.EOF) { | ||||
| 		p.parseError("unexpected end of input stream") | ||||
| 	} | ||||
| 	return p.metricFamiliesByName, p.err | ||||
| @@ -146,7 +148,7 @@ func (p *TextParser) startOfLine() stateFn { | ||||
| 		// which is not an error but the signal that we are done. | ||||
| 		// Any other error that happens to align with the start of | ||||
| 		// a line is still an error. | ||||
| 		if p.err == io.EOF { | ||||
| 		if errors.Is(p.err, io.EOF) { | ||||
| 			p.err = nil | ||||
| 		} | ||||
| 		return nil | ||||
|   | ||||
							
								
								
									
										4
									
								
								vendor/github.com/prometheus/common/model/alert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/github.com/prometheus/common/model/alert.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -90,13 +90,13 @@ func (a *Alert) Validate() error { | ||||
| 		return fmt.Errorf("start time must be before end time") | ||||
| 	} | ||||
| 	if err := a.Labels.Validate(); err != nil { | ||||
| 		return fmt.Errorf("invalid label set: %s", err) | ||||
| 		return fmt.Errorf("invalid label set: %w", err) | ||||
| 	} | ||||
| 	if len(a.Labels) == 0 { | ||||
| 		return fmt.Errorf("at least one label pair required") | ||||
| 	} | ||||
| 	if err := a.Annotations.Validate(); err != nil { | ||||
| 		return fmt.Errorf("invalid annotations: %s", err) | ||||
| 		return fmt.Errorf("invalid annotations: %w", err) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|   | ||||
							
								
								
									
										22
									
								
								vendor/github.com/prometheus/common/model/labels.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								vendor/github.com/prometheus/common/model/labels.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -97,17 +97,25 @@ var LabelNameRE = regexp.MustCompile("^[a-zA-Z_][a-zA-Z0-9_]*$") | ||||
| // therewith. | ||||
| type LabelName string | ||||
|  | ||||
| // IsValid is true iff the label name matches the pattern of LabelNameRE. This | ||||
| // method, however, does not use LabelNameRE for the check but a much faster | ||||
| // hardcoded implementation. | ||||
| // IsValid returns true iff name matches the pattern of LabelNameRE for legacy | ||||
| // names, and iff it's valid UTF-8 if NameValidationScheme is set to | ||||
| // UTF8Validation. For the legacy matching, it does not use LabelNameRE for the | ||||
| // check but a much faster hardcoded implementation. | ||||
| func (ln LabelName) IsValid() bool { | ||||
| 	if len(ln) == 0 { | ||||
| 		return false | ||||
| 	} | ||||
| 	for i, b := range ln { | ||||
| 		if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || (b >= '0' && b <= '9' && i > 0)) { | ||||
| 			return false | ||||
| 	switch NameValidationScheme { | ||||
| 	case LegacyValidation: | ||||
| 		for i, b := range ln { | ||||
| 			if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || (b >= '0' && b <= '9' && i > 0)) { | ||||
| 				return false | ||||
| 			} | ||||
| 		} | ||||
| 	case UTF8Validation: | ||||
| 		return utf8.ValidString(string(ln)) | ||||
| 	default: | ||||
| 		panic(fmt.Sprintf("Invalid name validation scheme requested: %d", NameValidationScheme)) | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
| @@ -164,7 +172,7 @@ func (l LabelNames) String() string { | ||||
| // A LabelValue is an associated value for a LabelName. | ||||
| type LabelValue string | ||||
|  | ||||
| // IsValid returns true iff the string is a valid UTF8. | ||||
| // IsValid returns true iff the string is a valid UTF-8. | ||||
| func (lv LabelValue) IsValid() bool { | ||||
| 	return utf8.ValidString(string(lv)) | ||||
| } | ||||
|   | ||||
							
								
								
									
										28
									
								
								vendor/github.com/prometheus/common/model/metadata.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								vendor/github.com/prometheus/common/model/metadata.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| // Copyright 2023 The Prometheus 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. | ||||
|  | ||||
| package model | ||||
|  | ||||
| // MetricType represents metric type values. | ||||
| type MetricType string | ||||
|  | ||||
| const ( | ||||
| 	MetricTypeCounter        = MetricType("counter") | ||||
| 	MetricTypeGauge          = MetricType("gauge") | ||||
| 	MetricTypeHistogram      = MetricType("histogram") | ||||
| 	MetricTypeGaugeHistogram = MetricType("gaugehistogram") | ||||
| 	MetricTypeSummary        = MetricType("summary") | ||||
| 	MetricTypeInfo           = MetricType("info") | ||||
| 	MetricTypeStateset       = MetricType("stateset") | ||||
| 	MetricTypeUnknown        = MetricType("unknown") | ||||
| ) | ||||
							
								
								
									
										368
									
								
								vendor/github.com/prometheus/common/model/metric.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										368
									
								
								vendor/github.com/prometheus/common/model/metric.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -18,15 +18,84 @@ import ( | ||||
| 	"regexp" | ||||
| 	"sort" | ||||
| 	"strings" | ||||
| 	"unicode/utf8" | ||||
|  | ||||
| 	dto "github.com/prometheus/client_model/go" | ||||
| 	"google.golang.org/protobuf/proto" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	// MetricNameRE is a regular expression matching valid metric | ||||
| 	// names. Note that the IsValidMetricName function performs the same | ||||
| 	// check but faster than a match with this regular expression. | ||||
| 	MetricNameRE = regexp.MustCompile(`^[a-zA-Z_:][a-zA-Z0-9_:]*$`) | ||||
| 	// NameValidationScheme determines the method of name validation to be used by | ||||
| 	// all calls to IsValidMetricName() and LabelName IsValid(). Setting UTF-8 mode | ||||
| 	// in isolation from other components that don't support UTF-8 may result in | ||||
| 	// bugs or other undefined behavior. This value is intended to be set by | ||||
| 	// UTF-8-aware binaries as part of their startup. To avoid need for locking, | ||||
| 	// this value should be set once, ideally in an init(), before multiple | ||||
| 	// goroutines are started. | ||||
| 	NameValidationScheme = LegacyValidation | ||||
|  | ||||
| 	// NameEscapingScheme defines the default way that names will be | ||||
| 	// escaped when presented to systems that do not support UTF-8 names. If the | ||||
| 	// Content-Type "escaping" term is specified, that will override this value. | ||||
| 	NameEscapingScheme = ValueEncodingEscaping | ||||
| ) | ||||
|  | ||||
| // ValidationScheme is a Go enum for determining how metric and label names will | ||||
| // be validated by this library. | ||||
| type ValidationScheme int | ||||
|  | ||||
| const ( | ||||
| 	// LegacyValidation is a setting that requirets that metric and label names | ||||
| 	// conform to the original Prometheus character requirements described by | ||||
| 	// MetricNameRE and LabelNameRE. | ||||
| 	LegacyValidation ValidationScheme = iota | ||||
|  | ||||
| 	// UTF8Validation only requires that metric and label names be valid UTF-8 | ||||
| 	// strings. | ||||
| 	UTF8Validation | ||||
| ) | ||||
|  | ||||
| type EscapingScheme int | ||||
|  | ||||
| const ( | ||||
| 	// NoEscaping indicates that a name will not be escaped. Unescaped names that | ||||
| 	// do not conform to the legacy validity check will use a new exposition | ||||
| 	// format syntax that will be officially standardized in future versions. | ||||
| 	NoEscaping EscapingScheme = iota | ||||
|  | ||||
| 	// UnderscoreEscaping replaces all legacy-invalid characters with underscores. | ||||
| 	UnderscoreEscaping | ||||
|  | ||||
| 	// DotsEscaping is similar to UnderscoreEscaping, except that dots are | ||||
| 	// converted to `_dot_` and pre-existing underscores are converted to `__`. | ||||
| 	DotsEscaping | ||||
|  | ||||
| 	// ValueEncodingEscaping prepends the name with `U__` and replaces all invalid | ||||
| 	// characters with the unicode value, surrounded by underscores. Single | ||||
| 	// underscores are replaced with double underscores. | ||||
| 	ValueEncodingEscaping | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	// EscapingKey is the key in an Accept or Content-Type header that defines how | ||||
| 	// metric and label names that do not conform to the legacy character | ||||
| 	// requirements should be escaped when being scraped by a legacy prometheus | ||||
| 	// system. If a system does not explicitly pass an escaping parameter in the | ||||
| 	// Accept header, the default NameEscapingScheme will be used. | ||||
| 	EscapingKey = "escaping" | ||||
|  | ||||
| 	// Possible values for Escaping Key: | ||||
| 	AllowUTF8         = "allow-utf-8" // No escaping required. | ||||
| 	EscapeUnderscores = "underscores" | ||||
| 	EscapeDots        = "dots" | ||||
| 	EscapeValues      = "values" | ||||
| ) | ||||
|  | ||||
| // MetricNameRE is a regular expression matching valid metric | ||||
| // names. Note that the IsValidMetricName function performs the same | ||||
| // check but faster than a match with this regular expression. | ||||
| var MetricNameRE = regexp.MustCompile(`^[a-zA-Z_:][a-zA-Z0-9_:]*$`) | ||||
|  | ||||
| // A Metric is similar to a LabelSet, but the key difference is that a Metric is | ||||
| // a singleton and refers to one and only one stream of samples. | ||||
| type Metric LabelSet | ||||
| @@ -86,17 +155,302 @@ func (m Metric) FastFingerprint() Fingerprint { | ||||
| 	return LabelSet(m).FastFingerprint() | ||||
| } | ||||
|  | ||||
| // IsValidMetricName returns true iff name matches the pattern of MetricNameRE. | ||||
| // IsValidMetricName returns true iff name matches the pattern of MetricNameRE | ||||
| // for legacy names, and iff it's valid UTF-8 if the UTF8Validation scheme is | ||||
| // selected. | ||||
| func IsValidMetricName(n LabelValue) bool { | ||||
| 	switch NameValidationScheme { | ||||
| 	case LegacyValidation: | ||||
| 		return IsValidLegacyMetricName(n) | ||||
| 	case UTF8Validation: | ||||
| 		if len(n) == 0 { | ||||
| 			return false | ||||
| 		} | ||||
| 		return utf8.ValidString(string(n)) | ||||
| 	default: | ||||
| 		panic(fmt.Sprintf("Invalid name validation scheme requested: %d", NameValidationScheme)) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // IsValidLegacyMetricName is similar to IsValidMetricName but always uses the | ||||
| // legacy validation scheme regardless of the value of NameValidationScheme. | ||||
| // This function, however, does not use MetricNameRE for the check but a much | ||||
| // faster hardcoded implementation. | ||||
| func IsValidMetricName(n LabelValue) bool { | ||||
| func IsValidLegacyMetricName(n LabelValue) bool { | ||||
| 	if len(n) == 0 { | ||||
| 		return false | ||||
| 	} | ||||
| 	for i, b := range n { | ||||
| 		if !((b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || b == ':' || (b >= '0' && b <= '9' && i > 0)) { | ||||
| 		if !isValidLegacyRune(b, i) { | ||||
| 			return false | ||||
| 		} | ||||
| 	} | ||||
| 	return true | ||||
| } | ||||
|  | ||||
| // EscapeMetricFamily escapes the given metric names and labels with the given | ||||
| // escaping scheme. Returns a new object that uses the same pointers to fields | ||||
| // when possible and creates new escaped versions so as not to mutate the | ||||
| // input. | ||||
| func EscapeMetricFamily(v *dto.MetricFamily, scheme EscapingScheme) *dto.MetricFamily { | ||||
| 	if v == nil { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	if scheme == NoEscaping { | ||||
| 		return v | ||||
| 	} | ||||
|  | ||||
| 	out := &dto.MetricFamily{ | ||||
| 		Help: v.Help, | ||||
| 		Type: v.Type, | ||||
| 	} | ||||
|  | ||||
| 	// If the name is nil, copy as-is, don't try to escape. | ||||
| 	if v.Name == nil || IsValidLegacyMetricName(LabelValue(v.GetName())) { | ||||
| 		out.Name = v.Name | ||||
| 	} else { | ||||
| 		out.Name = proto.String(EscapeName(v.GetName(), scheme)) | ||||
| 	} | ||||
| 	for _, m := range v.Metric { | ||||
| 		if !metricNeedsEscaping(m) { | ||||
| 			out.Metric = append(out.Metric, m) | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		escaped := &dto.Metric{ | ||||
| 			Gauge:       m.Gauge, | ||||
| 			Counter:     m.Counter, | ||||
| 			Summary:     m.Summary, | ||||
| 			Untyped:     m.Untyped, | ||||
| 			Histogram:   m.Histogram, | ||||
| 			TimestampMs: m.TimestampMs, | ||||
| 		} | ||||
|  | ||||
| 		for _, l := range m.Label { | ||||
| 			if l.GetName() == MetricNameLabel { | ||||
| 				if l.Value == nil || IsValidLegacyMetricName(LabelValue(l.GetValue())) { | ||||
| 					escaped.Label = append(escaped.Label, l) | ||||
| 					continue | ||||
| 				} | ||||
| 				escaped.Label = append(escaped.Label, &dto.LabelPair{ | ||||
| 					Name:  proto.String(MetricNameLabel), | ||||
| 					Value: proto.String(EscapeName(l.GetValue(), scheme)), | ||||
| 				}) | ||||
| 				continue | ||||
| 			} | ||||
| 			if l.Name == nil || IsValidLegacyMetricName(LabelValue(l.GetName())) { | ||||
| 				escaped.Label = append(escaped.Label, l) | ||||
| 				continue | ||||
| 			} | ||||
| 			escaped.Label = append(escaped.Label, &dto.LabelPair{ | ||||
| 				Name:  proto.String(EscapeName(l.GetName(), scheme)), | ||||
| 				Value: l.Value, | ||||
| 			}) | ||||
| 		} | ||||
| 		out.Metric = append(out.Metric, escaped) | ||||
| 	} | ||||
| 	return out | ||||
| } | ||||
|  | ||||
| func metricNeedsEscaping(m *dto.Metric) bool { | ||||
| 	for _, l := range m.Label { | ||||
| 		if l.GetName() == MetricNameLabel && !IsValidLegacyMetricName(LabelValue(l.GetValue())) { | ||||
| 			return true | ||||
| 		} | ||||
| 		if !IsValidLegacyMetricName(LabelValue(l.GetName())) { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
|  | ||||
| const ( | ||||
| 	lowerhex = "0123456789abcdef" | ||||
| ) | ||||
|  | ||||
| // EscapeName escapes the incoming name according to the provided escaping | ||||
| // scheme. Depending on the rules of escaping, this may cause no change in the | ||||
| // string that is returned. (Especially NoEscaping, which by definition is a | ||||
| // noop). This function does not do any validation of the name. | ||||
| func EscapeName(name string, scheme EscapingScheme) string { | ||||
| 	if len(name) == 0 { | ||||
| 		return name | ||||
| 	} | ||||
| 	var escaped strings.Builder | ||||
| 	switch scheme { | ||||
| 	case NoEscaping: | ||||
| 		return name | ||||
| 	case UnderscoreEscaping: | ||||
| 		if IsValidLegacyMetricName(LabelValue(name)) { | ||||
| 			return name | ||||
| 		} | ||||
| 		for i, b := range name { | ||||
| 			if isValidLegacyRune(b, i) { | ||||
| 				escaped.WriteRune(b) | ||||
| 			} else { | ||||
| 				escaped.WriteRune('_') | ||||
| 			} | ||||
| 		} | ||||
| 		return escaped.String() | ||||
| 	case DotsEscaping: | ||||
| 		// Do not early return for legacy valid names, we still escape underscores. | ||||
| 		for i, b := range name { | ||||
| 			if b == '_' { | ||||
| 				escaped.WriteString("__") | ||||
| 			} else if b == '.' { | ||||
| 				escaped.WriteString("_dot_") | ||||
| 			} else if isValidLegacyRune(b, i) { | ||||
| 				escaped.WriteRune(b) | ||||
| 			} else { | ||||
| 				escaped.WriteRune('_') | ||||
| 			} | ||||
| 		} | ||||
| 		return escaped.String() | ||||
| 	case ValueEncodingEscaping: | ||||
| 		if IsValidLegacyMetricName(LabelValue(name)) { | ||||
| 			return name | ||||
| 		} | ||||
| 		escaped.WriteString("U__") | ||||
| 		for i, b := range name { | ||||
| 			if isValidLegacyRune(b, i) { | ||||
| 				escaped.WriteRune(b) | ||||
| 			} else if !utf8.ValidRune(b) { | ||||
| 				escaped.WriteString("_FFFD_") | ||||
| 			} else if b < 0x100 { | ||||
| 				escaped.WriteRune('_') | ||||
| 				for s := 4; s >= 0; s -= 4 { | ||||
| 					escaped.WriteByte(lowerhex[b>>uint(s)&0xF]) | ||||
| 				} | ||||
| 				escaped.WriteRune('_') | ||||
| 			} else if b < 0x10000 { | ||||
| 				escaped.WriteRune('_') | ||||
| 				for s := 12; s >= 0; s -= 4 { | ||||
| 					escaped.WriteByte(lowerhex[b>>uint(s)&0xF]) | ||||
| 				} | ||||
| 				escaped.WriteRune('_') | ||||
| 			} | ||||
| 		} | ||||
| 		return escaped.String() | ||||
| 	default: | ||||
| 		panic(fmt.Sprintf("invalid escaping scheme %d", scheme)) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // lower function taken from strconv.atoi | ||||
| func lower(c byte) byte { | ||||
| 	return c | ('x' - 'X') | ||||
| } | ||||
|  | ||||
| // UnescapeName unescapes the incoming name according to the provided escaping | ||||
| // scheme if possible. Some schemes are partially or totally non-roundtripable. | ||||
| // If any error is enountered, returns the original input. | ||||
| func UnescapeName(name string, scheme EscapingScheme) string { | ||||
| 	if len(name) == 0 { | ||||
| 		return name | ||||
| 	} | ||||
| 	switch scheme { | ||||
| 	case NoEscaping: | ||||
| 		return name | ||||
| 	case UnderscoreEscaping: | ||||
| 		// It is not possible to unescape from underscore replacement. | ||||
| 		return name | ||||
| 	case DotsEscaping: | ||||
| 		name = strings.ReplaceAll(name, "_dot_", ".") | ||||
| 		name = strings.ReplaceAll(name, "__", "_") | ||||
| 		return name | ||||
| 	case ValueEncodingEscaping: | ||||
| 		escapedName, found := strings.CutPrefix(name, "U__") | ||||
| 		if !found { | ||||
| 			return name | ||||
| 		} | ||||
|  | ||||
| 		var unescaped strings.Builder | ||||
| 	TOP: | ||||
| 		for i := 0; i < len(escapedName); i++ { | ||||
| 			// All non-underscores are treated normally. | ||||
| 			if escapedName[i] != '_' { | ||||
| 				unescaped.WriteByte(escapedName[i]) | ||||
| 				continue | ||||
| 			} | ||||
| 			i++ | ||||
| 			if i >= len(escapedName) { | ||||
| 				return name | ||||
| 			} | ||||
| 			// A double underscore is a single underscore. | ||||
| 			if escapedName[i] == '_' { | ||||
| 				unescaped.WriteByte('_') | ||||
| 				continue | ||||
| 			} | ||||
| 			// We think we are in a UTF-8 code, process it. | ||||
| 			var utf8Val uint | ||||
| 			for j := 0; i < len(escapedName); j++ { | ||||
| 				// This is too many characters for a utf8 value. | ||||
| 				if j > 4 { | ||||
| 					return name | ||||
| 				} | ||||
| 				// Found a closing underscore, convert to a rune, check validity, and append. | ||||
| 				if escapedName[i] == '_' { | ||||
| 					utf8Rune := rune(utf8Val) | ||||
| 					if !utf8.ValidRune(utf8Rune) { | ||||
| 						return name | ||||
| 					} | ||||
| 					unescaped.WriteRune(utf8Rune) | ||||
| 					continue TOP | ||||
| 				} | ||||
| 				r := lower(escapedName[i]) | ||||
| 				utf8Val *= 16 | ||||
| 				if r >= '0' && r <= '9' { | ||||
| 					utf8Val += uint(r) - '0' | ||||
| 				} else if r >= 'a' && r <= 'f' { | ||||
| 					utf8Val += uint(r) - 'a' + 10 | ||||
| 				} else { | ||||
| 					return name | ||||
| 				} | ||||
| 				i++ | ||||
| 			} | ||||
| 			// Didn't find closing underscore, invalid. | ||||
| 			return name | ||||
| 		} | ||||
| 		return unescaped.String() | ||||
| 	default: | ||||
| 		panic(fmt.Sprintf("invalid escaping scheme %d", scheme)) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func isValidLegacyRune(b rune, i int) bool { | ||||
| 	return (b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z') || b == '_' || b == ':' || (b >= '0' && b <= '9' && i > 0) | ||||
| } | ||||
|  | ||||
| func (e EscapingScheme) String() string { | ||||
| 	switch e { | ||||
| 	case NoEscaping: | ||||
| 		return AllowUTF8 | ||||
| 	case UnderscoreEscaping: | ||||
| 		return EscapeUnderscores | ||||
| 	case DotsEscaping: | ||||
| 		return EscapeDots | ||||
| 	case ValueEncodingEscaping: | ||||
| 		return EscapeValues | ||||
| 	default: | ||||
| 		panic(fmt.Sprintf("unknown format scheme %d", e)) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func ToEscapingScheme(s string) (EscapingScheme, error) { | ||||
| 	if s == "" { | ||||
| 		return NoEscaping, fmt.Errorf("got empty string instead of escaping scheme") | ||||
| 	} | ||||
| 	switch s { | ||||
| 	case AllowUTF8: | ||||
| 		return NoEscaping, nil | ||||
| 	case EscapeUnderscores: | ||||
| 		return UnderscoreEscaping, nil | ||||
| 	case EscapeDots: | ||||
| 		return DotsEscaping, nil | ||||
| 	case EscapeValues: | ||||
| 		return ValueEncodingEscaping, nil | ||||
| 	default: | ||||
| 		return NoEscaping, fmt.Errorf("unknown format scheme " + s) | ||||
| 	} | ||||
| } | ||||
|   | ||||
							
								
								
									
										6
									
								
								vendor/github.com/prometheus/common/model/signature.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								vendor/github.com/prometheus/common/model/signature.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -22,10 +22,8 @@ import ( | ||||
| // when calculating their combined hash value (aka signature aka fingerprint). | ||||
| const SeparatorByte byte = 255 | ||||
|  | ||||
| var ( | ||||
| 	// cache the signature of an empty label set. | ||||
| 	emptyLabelSignature = hashNew() | ||||
| ) | ||||
| // cache the signature of an empty label set. | ||||
| var emptyLabelSignature = hashNew() | ||||
|  | ||||
| // LabelsToSignature returns a quasi-unique signature (i.e., fingerprint) for a | ||||
| // given label set. (Collisions are possible but unlikely if the number of label | ||||
|   | ||||
							
								
								
									
										2
									
								
								vendor/github.com/prometheus/common/model/silence.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/prometheus/common/model/silence.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -81,7 +81,7 @@ func (s *Silence) Validate() error { | ||||
| 	} | ||||
| 	for _, m := range s.Matchers { | ||||
| 		if err := m.Validate(); err != nil { | ||||
| 			return fmt.Errorf("invalid matcher: %s", err) | ||||
| 			return fmt.Errorf("invalid matcher: %w", err) | ||||
| 		} | ||||
| 	} | ||||
| 	if s.StartsAt.IsZero() { | ||||
|   | ||||
							
								
								
									
										16
									
								
								vendor/github.com/prometheus/common/model/value.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										16
									
								
								vendor/github.com/prometheus/common/model/value.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -21,14 +21,12 @@ import ( | ||||
| 	"strings" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	// ZeroSample is the pseudo zero-value of Sample used to signal a | ||||
| 	// non-existing sample. It is a Sample with timestamp Earliest, value 0.0, | ||||
| 	// and metric nil. Note that the natural zero value of Sample has a timestamp | ||||
| 	// of 0, which is possible to appear in a real Sample and thus not suitable | ||||
| 	// to signal a non-existing Sample. | ||||
| 	ZeroSample = Sample{Timestamp: Earliest} | ||||
| ) | ||||
| // ZeroSample is the pseudo zero-value of Sample used to signal a | ||||
| // non-existing sample. It is a Sample with timestamp Earliest, value 0.0, | ||||
| // and metric nil. Note that the natural zero value of Sample has a timestamp | ||||
| // of 0, which is possible to appear in a real Sample and thus not suitable | ||||
| // to signal a non-existing Sample. | ||||
| var ZeroSample = Sample{Timestamp: Earliest} | ||||
|  | ||||
| // Sample is a sample pair associated with a metric. A single sample must either | ||||
| // define Value or Histogram but not both. Histogram == nil implies the Value | ||||
| @@ -274,7 +272,7 @@ func (s *Scalar) UnmarshalJSON(b []byte) error { | ||||
|  | ||||
| 	value, err := strconv.ParseFloat(f, 64) | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("error parsing sample value: %s", err) | ||||
| 		return fmt.Errorf("error parsing sample value: %w", err) | ||||
| 	} | ||||
| 	s.Value = SampleValue(value) | ||||
| 	return nil | ||||
|   | ||||
							
								
								
									
										14
									
								
								vendor/github.com/prometheus/common/model/value_float.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								vendor/github.com/prometheus/common/model/value_float.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -20,14 +20,12 @@ import ( | ||||
| 	"strconv" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	// ZeroSamplePair is the pseudo zero-value of SamplePair used to signal a | ||||
| 	// non-existing sample pair. It is a SamplePair with timestamp Earliest and | ||||
| 	// value 0.0. Note that the natural zero value of SamplePair has a timestamp | ||||
| 	// of 0, which is possible to appear in a real SamplePair and thus not | ||||
| 	// suitable to signal a non-existing SamplePair. | ||||
| 	ZeroSamplePair = SamplePair{Timestamp: Earliest} | ||||
| ) | ||||
| // ZeroSamplePair is the pseudo zero-value of SamplePair used to signal a | ||||
| // non-existing sample pair. It is a SamplePair with timestamp Earliest and | ||||
| // value 0.0. Note that the natural zero value of SamplePair has a timestamp | ||||
| // of 0, which is possible to appear in a real SamplePair and thus not | ||||
| // suitable to signal a non-existing SamplePair. | ||||
| var ZeroSamplePair = SamplePair{Timestamp: Earliest} | ||||
|  | ||||
| // A SampleValue is a representation of a value for a given sample at a given | ||||
| // time. | ||||
|   | ||||
							
								
								
									
										160
									
								
								vendor/google.golang.org/protobuf/encoding/protodelim/protodelim.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								vendor/google.golang.org/protobuf/encoding/protodelim/protodelim.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,160 @@ | ||||
| // Copyright 2022 The Go Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| // Package protodelim marshals and unmarshals varint size-delimited messages. | ||||
| package protodelim | ||||
|  | ||||
| import ( | ||||
| 	"bufio" | ||||
| 	"encoding/binary" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
|  | ||||
| 	"google.golang.org/protobuf/encoding/protowire" | ||||
| 	"google.golang.org/protobuf/internal/errors" | ||||
| 	"google.golang.org/protobuf/proto" | ||||
| ) | ||||
|  | ||||
| // MarshalOptions is a configurable varint size-delimited marshaler. | ||||
| type MarshalOptions struct{ proto.MarshalOptions } | ||||
|  | ||||
| // MarshalTo writes a varint size-delimited wire-format message to w. | ||||
| // If w returns an error, MarshalTo returns it unchanged. | ||||
| func (o MarshalOptions) MarshalTo(w io.Writer, m proto.Message) (int, error) { | ||||
| 	msgBytes, err := o.MarshalOptions.Marshal(m) | ||||
| 	if err != nil { | ||||
| 		return 0, err | ||||
| 	} | ||||
|  | ||||
| 	sizeBytes := protowire.AppendVarint(nil, uint64(len(msgBytes))) | ||||
| 	sizeWritten, err := w.Write(sizeBytes) | ||||
| 	if err != nil { | ||||
| 		return sizeWritten, err | ||||
| 	} | ||||
| 	msgWritten, err := w.Write(msgBytes) | ||||
| 	if err != nil { | ||||
| 		return sizeWritten + msgWritten, err | ||||
| 	} | ||||
| 	return sizeWritten + msgWritten, nil | ||||
| } | ||||
|  | ||||
| // MarshalTo writes a varint size-delimited wire-format message to w | ||||
| // with the default options. | ||||
| // | ||||
| // See the documentation for [MarshalOptions.MarshalTo]. | ||||
| func MarshalTo(w io.Writer, m proto.Message) (int, error) { | ||||
| 	return MarshalOptions{}.MarshalTo(w, m) | ||||
| } | ||||
|  | ||||
| // UnmarshalOptions is a configurable varint size-delimited unmarshaler. | ||||
| type UnmarshalOptions struct { | ||||
| 	proto.UnmarshalOptions | ||||
|  | ||||
| 	// MaxSize is the maximum size in wire-format bytes of a single message. | ||||
| 	// Unmarshaling a message larger than MaxSize will return an error. | ||||
| 	// A zero MaxSize will default to 4 MiB. | ||||
| 	// Setting MaxSize to -1 disables the limit. | ||||
| 	MaxSize int64 | ||||
| } | ||||
|  | ||||
| const defaultMaxSize = 4 << 20 // 4 MiB, corresponds to the default gRPC max request/response size | ||||
|  | ||||
| // SizeTooLargeError is an error that is returned when the unmarshaler encounters a message size | ||||
| // that is larger than its configured [UnmarshalOptions.MaxSize]. | ||||
| type SizeTooLargeError struct { | ||||
| 	// Size is the varint size of the message encountered | ||||
| 	// that was larger than the provided MaxSize. | ||||
| 	Size uint64 | ||||
|  | ||||
| 	// MaxSize is the MaxSize limit configured in UnmarshalOptions, which Size exceeded. | ||||
| 	MaxSize uint64 | ||||
| } | ||||
|  | ||||
| func (e *SizeTooLargeError) Error() string { | ||||
| 	return fmt.Sprintf("message size %d exceeded unmarshaler's maximum configured size %d", e.Size, e.MaxSize) | ||||
| } | ||||
|  | ||||
| // Reader is the interface expected by [UnmarshalFrom]. | ||||
| // It is implemented by *[bufio.Reader]. | ||||
| type Reader interface { | ||||
| 	io.Reader | ||||
| 	io.ByteReader | ||||
| } | ||||
|  | ||||
| // UnmarshalFrom parses and consumes a varint size-delimited wire-format message | ||||
| // from r. | ||||
| // The provided message must be mutable (e.g., a non-nil pointer to a message). | ||||
| // | ||||
| // The error is [io.EOF] error only if no bytes are read. | ||||
| // If an EOF happens after reading some but not all the bytes, | ||||
| // UnmarshalFrom returns a non-io.EOF error. | ||||
| // In particular if r returns a non-io.EOF error, UnmarshalFrom returns it unchanged, | ||||
| // and if only a size is read with no subsequent message, [io.ErrUnexpectedEOF] is returned. | ||||
| func (o UnmarshalOptions) UnmarshalFrom(r Reader, m proto.Message) error { | ||||
| 	var sizeArr [binary.MaxVarintLen64]byte | ||||
| 	sizeBuf := sizeArr[:0] | ||||
| 	for i := range sizeArr { | ||||
| 		b, err := r.ReadByte() | ||||
| 		if err != nil { | ||||
| 			// Immediate EOF is unexpected. | ||||
| 			if err == io.EOF && i != 0 { | ||||
| 				break | ||||
| 			} | ||||
| 			return err | ||||
| 		} | ||||
| 		sizeBuf = append(sizeBuf, b) | ||||
| 		if b < 0x80 { | ||||
| 			break | ||||
| 		} | ||||
| 	} | ||||
| 	size, n := protowire.ConsumeVarint(sizeBuf) | ||||
| 	if n < 0 { | ||||
| 		return protowire.ParseError(n) | ||||
| 	} | ||||
|  | ||||
| 	maxSize := o.MaxSize | ||||
| 	if maxSize == 0 { | ||||
| 		maxSize = defaultMaxSize | ||||
| 	} | ||||
| 	if maxSize != -1 && size > uint64(maxSize) { | ||||
| 		return errors.Wrap(&SizeTooLargeError{Size: size, MaxSize: uint64(maxSize)}, "") | ||||
| 	} | ||||
|  | ||||
| 	var b []byte | ||||
| 	var err error | ||||
| 	if br, ok := r.(*bufio.Reader); ok { | ||||
| 		// Use the []byte from the bufio.Reader instead of having to allocate one. | ||||
| 		// This reduces CPU usage and allocated bytes. | ||||
| 		b, err = br.Peek(int(size)) | ||||
| 		if err == nil { | ||||
| 			defer br.Discard(int(size)) | ||||
| 		} else { | ||||
| 			b = nil | ||||
| 		} | ||||
| 	} | ||||
| 	if b == nil { | ||||
| 		b = make([]byte, size) | ||||
| 		_, err = io.ReadFull(r, b) | ||||
| 	} | ||||
|  | ||||
| 	if err == io.EOF { | ||||
| 		return io.ErrUnexpectedEOF | ||||
| 	} | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if err := o.Unmarshal(b, m); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // UnmarshalFrom parses and consumes a varint size-delimited wire-format message | ||||
| // from r with the default options. | ||||
| // The provided message must be mutable (e.g., a non-nil pointer to a message). | ||||
| // | ||||
| // See the documentation for [UnmarshalOptions.UnmarshalFrom]. | ||||
| func UnmarshalFrom(r Reader, m proto.Message) error { | ||||
| 	return UnmarshalOptions{}.UnmarshalFrom(r, m) | ||||
| } | ||||
							
								
								
									
										10
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							| @@ -276,9 +276,6 @@ github.com/klauspost/compress/zstd/internal/xxhash | ||||
| # github.com/klauspost/cpuid/v2 v2.2.5 | ||||
| ## explicit; go 1.15 | ||||
| github.com/klauspost/cpuid/v2 | ||||
| # github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 | ||||
| ## explicit; go 1.19 | ||||
| github.com/matttproud/golang_protobuf_extensions/v2/pbutil | ||||
| # github.com/mdlayher/socket v0.4.1 | ||||
| ## explicit; go 1.20 | ||||
| github.com/mdlayher/socket | ||||
| @@ -355,15 +352,15 @@ github.com/pkg/errors | ||||
| # github.com/pmezard/go-difflib v1.0.0 | ||||
| ## explicit | ||||
| github.com/pmezard/go-difflib/difflib | ||||
| # github.com/prometheus/client_golang v1.18.0 | ||||
| ## explicit; go 1.19 | ||||
| # github.com/prometheus/client_golang v1.19.0 | ||||
| ## explicit; go 1.20 | ||||
| github.com/prometheus/client_golang/prometheus | ||||
| github.com/prometheus/client_golang/prometheus/internal | ||||
| github.com/prometheus/client_golang/prometheus/promhttp | ||||
| # github.com/prometheus/client_model v0.5.0 | ||||
| ## explicit; go 1.19 | ||||
| github.com/prometheus/client_model/go | ||||
| # github.com/prometheus/common v0.45.0 | ||||
| # github.com/prometheus/common v0.48.0 | ||||
| ## explicit; go 1.20 | ||||
| github.com/prometheus/common/expfmt | ||||
| github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg | ||||
| @@ -626,6 +623,7 @@ google.golang.org/grpc/tap | ||||
| # google.golang.org/protobuf v1.32.0 | ||||
| ## explicit; go 1.17 | ||||
| google.golang.org/protobuf/compiler/protogen | ||||
| google.golang.org/protobuf/encoding/protodelim | ||||
| google.golang.org/protobuf/encoding/protojson | ||||
| google.golang.org/protobuf/encoding/prototext | ||||
| google.golang.org/protobuf/encoding/protowire | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	![49699333+dependabot[bot]@users.noreply.github.com](/assets/img/avatar_default.png) dependabot[bot]
					dependabot[bot]