Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add OpenMetrics unit support #544

Merged
merged 1 commit into from Mar 6, 2024
Merged

Add OpenMetrics unit support #544

merged 1 commit into from Mar 6, 2024

Conversation

vesari
Copy link
Contributor

@vesari vesari commented Dec 2, 2023

@vesari vesari marked this pull request as ready for review December 7, 2023 12:29
@vesari
Copy link
Contributor Author

vesari commented Dec 7, 2023

@ArthurSens this is now ready for review, thanks.

@ArthurSens
Copy link
Member

ArthurSens commented Dec 7, 2023

Implementation and tests looks good to me!

On the other hand, we had a brief discussion on slack and we suspect that enforcing units to be present in the MetricFamily name is a breaking change that we should be careful about.

We know that client_golang uses prometheus/common but maybe there are others? We could make this method opt-in with something like this

type ToOpenMetrics struct {
  withUnit bool
  // withCreated bool can be added in the future
}

type ToOpenMetricsOption = func(*ToOpenMetrics)

func ToOpenMetricsWithUnit() ToOpenMetricsOption {
  return func(om *ToOpenMetrics) {
    om.withUnit = true
  }
}

func MetricFamilyToOpenMetrics(out io.Writer, in *dto.MetricFamily, options ...ToOpenMetricsOption) (written int, err error) {
  toOM = ToOpenMetrics{}
  for _, option := range options {
    option(&toOM)
  }
.
.
.
  if toOM.withUnit && in.Unit != nil {
  // print Unit as usual
  }
.
.
.
}

Downstream projects could safely bump promethes/common version, while having the option to adopt units when appropriate:

// Will keep the same behavior as today, even if unit is set
common.MetricFamilyToOpenMetrics(out, in)

// Will add unit to the metricFamily name as suffix
common.MetricFamilyToOpenMetrics(out, in, common.ToOpenMetricsWithUnit())

@vesari
Copy link
Contributor Author

vesari commented Dec 15, 2023

@ArthurSens this is now ready for review. I hope I have interpreted correctly both your suggestions and the gist of your Slack conversation.

Copy link
Member

@ArthurSens ArthurSens left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great improvement! Have you tried using this version of prometheus/common in your PR in client_golang? How did the changes here impacted over there?

I suspect we also need some changes to expfmt.NewEnconder as well.

@ArthurSens
Copy link
Member

pinging @beorn7 and @bwplotka, maybe you also have some input here

Copy link
Member

@ArthurSens ArthurSens left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we also have some tests for the case where the unit is set, but the option withUnit is not?

@beorn7
Copy link
Member

beorn7 commented Jan 18, 2024

Looks good in general. I don't have the time for a detailed review, but I trust you to do that alright on your own.

I should also add that I don't feel qualified to make any calls how to handle OpenMetrics and its quirks appropriately. (Not that I wouldn't have context. It's more that I have too much context, and that clouds my judgement.)

@vesari
Copy link
Contributor Author

vesari commented Jan 23, 2024

Great improvement! Have you tried using this version of prometheus/common in your PR in client_golang? How did the changes here impacted over there?

I suspect we also need some changes to expfmt.NewEnconder as well.

Thank you very much :) I have tried it on my branch (prometheus/client_golang#1392) and nothing seems to break or fail; however, I'll have to check again once I've modified expfmt.NewEncoder (thanks a lot for pointing that out!). I'll now convert this PR to draft for the time being, while I carry out the new changes and figure out their impact and ramifications in client_golang.

@vesari
Copy link
Contributor Author

vesari commented Jan 23, 2024

Could we also have some tests for the case where the unit is set, but the option withUnit is not?

That scenario is already covered by test n.10, but I now realise I could have named it more clearly, and of course I can add more tests.

@vesari vesari marked this pull request as draft January 23, 2024 10:27
Copy link
Member

@ArthurSens ArthurSens left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks almost ready! Thanks refactoring TestEncode with a table test, looks a lot better ❤️

I've made a few comments, but they are mostly around readability

Comment on lines 38 to 39
// function. It enables a set unit to be written to the output and to be added to the metric name, (if
// it's not there already), as a suffix. Without opting in this way, the unit will not be added to the
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// function. It enables a set unit to be written to the output and to be added to the metric name, (if
// it's not there already), as a suffix. Without opting in this way, the unit will not be added to the
// function. It enables a set unit to be written to the output and to be added to the metric name, if
// it's not there already, as a suffix. Without opting in this way, the unit will not be added to the

just small nit: no need for parenthesis if already separated from the main sentence with commas

var buff bytes.Buffer
delimEncoder := NewEncoder(&buff, FmtProtoDelim)
metric := &dto.MetricFamily{
metric1 := &dto.MetricFamily{
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What do you think about adding unit to metric1, so we don't need to create extra metrics for the OM format scenarios?

The OM Format is the only one that has a different output if unit is set, so I expect that this shouldn't require changes to the other formats

go.mod Outdated
github.com/prometheus/client_model v0.5.0
github.com/prometheus/client_model v0.5.1-0.20231205151710-c26a8eea9e44
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We probably want client_model 0.6.0 before merging this 🤔

Comment on lines 223 to 300
// N.B. For the first three cases, I'm maintaining the same checks as they were before, i. e. the expected output is
// not declared ergo no comparison with the actual output is ever performed, expect for its length being bigger than zero.
if i > 2 {
if expected, got := len(scenario.expOut), len(out.Bytes()); expected != got {
t.Errorf(
"%d. expected %d bytes written, got %d",
i, expected, got,
)
}
if expected, got := scenario.expOut, out.String(); expected != got {
t.Errorf(
"%d. expected out=%q, got %q",
i, expected, got,
)
}
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// N.B. For the first three cases, I'm maintaining the same checks as they were before, i. e. the expected output is
// not declared ergo no comparison with the actual output is ever performed, expect for its length being bigger than zero.
if i > 2 {
if expected, got := len(scenario.expOut), len(out.Bytes()); expected != got {
t.Errorf(
"%d. expected %d bytes written, got %d",
i, expected, got,
)
}
if expected, got := scenario.expOut, out.String(); expected != got {
t.Errorf(
"%d. expected out=%q, got %q",
i, expected, got,
)
}
}
if expected, got := len(scenario.expOut), len(out.Bytes()); expected != "" && expected != got {
t.Errorf(
"%d. expected %d bytes written, got %d",
i, expected, got,
)
}
if expected, got := scenario.expOut, out.String(); expected != "" && expected != got {
t.Errorf(
"%d. expected out=%q, got %q",
i, expected, got,
)
}

We can remove one indentation level if we compare when the expected output is not empty. Is this more readable/maintainable to you?

{
metric: metric1,
format: FmtProtoDelim,
// expOut: `\x1b\n\nfoo_metric\x18\x03\"\v*\t\tX9\xb4\xc8v\xbe\xf3?`, // does this look like the desired output?
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The problem with comparing protos in string format is that the output is not consistent, as far as I know. Proto will randomly add spaces between messages, making our comparison flaky.

I'd remove this commented line entirely. We weren't comparing the output before, so I don't think we need to compare now :)

@vesari vesari marked this pull request as ready for review February 13, 2024 11:27
@vesari
Copy link
Contributor Author

vesari commented Feb 13, 2024

@ArthurSens thank you very much for your guidance! I've addressed your change requests. This is now ready for review. About the client_model version upgrade, I’m not sure how to proceed, as I would think only maintainers are allowed to change it? Thanks for letting me know :)

@vesari
Copy link
Contributor Author

vesari commented Feb 29, 2024

@ArthurSens @bwplotka , could you please take a look? Since v0.6.0. of client_model has been adopted yesterday by this repo, unless you see something not correct in this PR, I guess it could be merged? Thanks a lot for your time as per usual :)

@SuperQ
Copy link
Member

SuperQ commented Feb 29, 2024

@vesari would you mind rebasing and squashing the commits?

@vesari
Copy link
Contributor Author

vesari commented Feb 29, 2024

@SuperQ done. Thank you!

Copy link
Member

@ArthurSens ArthurSens left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@vesari LGTM! thanks for your patience through all those months :)

I've noticed that a few unrelated changes were made, probably by mistake? Could you take a look?

Comment on lines 134 to 139
// String will look like `{foo="bar", more="less"}`. Names are sorted alphabetically.
func (l LabelSet) String() string {
var lna [32]LabelName // On stack to avoid memory allocation for sorting names.
labelNames := lna[:0]
for name := range l {
labelNames = append(labelNames, name)
lstrs := make([]string, 0, len(l))
for l, v := range l {
lstrs = append(lstrs, fmt.Sprintf("%s=%q", l, v))
}
slices.Sort(labelNames)
var bytea [1024]byte // On stack to avoid memory allocation while building the output.
b := bytes.NewBuffer(bytea[:0])
b.WriteByte('{')
for i, name := range labelNames {
if i > 0 {
b.WriteString(", ")
}
b.WriteString(string(name))
b.WriteByte('=')
b.Write(strconv.AppendQuote(b.AvailableBuffer(), string(l[name])))
}
b.WriteByte('}')
return b.String()

sort.Strings(lstrs)
return fmt.Sprintf("{%s}", strings.Join(lstrs, ", "))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Accidental change with the rebase?

Comment on lines 123 to 142

// Benchmark Results for LabelSet's String() method
// ---------------------------------------------------------------------------------------------------------
// goos: linux
// goarch: amd64
// pkg: github.com/prometheus/common/model
// cpu: 11th Gen Intel(R) Core(TM) i5-1145G7 @ 2.60GHz
// BenchmarkLabelSetStringMethod-8 732376 1532 ns/op

func BenchmarkLabelSetStringMethod(b *testing.B) {
ls := make(LabelSet)
ls["monitor"] = "codelab"
ls["foo2"] = "bar"
ls["foo"] = "bar"
ls["abc"] = "prometheus"
ls["foo11"] = "bar11"
for i := 0; i < b.N; i++ {
_ = ls.String()
}
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same thing here, probably by accident?

@vesari
Copy link
Contributor Author

vesari commented Mar 2, 2024

@ArthurSens thanks a lot for pointing that out, I'll have a look at it tomorrow morning then get back to you immediately after, thanks again

Signed-off-by: Arianna Vespri <arianna.vespri@yahoo.it>
@vesari
Copy link
Contributor Author

vesari commented Mar 3, 2024

@ArthurSens , I have now amended my previous commit and rebased again. Thank you very much for catching those 2 files that I had indeed not modified actively; like you, I can just assume something happened during the previous rebase. I hope now it's ready for merging :)

@ArthurSens
Copy link
Member

Awesome, could someone with merge rights also give a review?

Maybe @bwplotka, @SuperQ or @beorn7 ?

@SuperQ SuperQ requested a review from beorn7 March 6, 2024 13:20
Copy link
Member

@SuperQ SuperQ left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@SuperQ SuperQ merged commit 1e6ac24 into prometheus:main Mar 6, 2024
6 checks passed
@bboreham bboreham changed the title Add unit Add OpenMetrics unit support Mar 6, 2024
codeboten pushed a commit to open-telemetry/opentelemetry-collector-contrib that referenced this pull request Mar 14, 2024
)

[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [github.com/prometheus/common](https://togithub.com/prometheus/common)
| `v0.49.0` -> `v0.50.0` |
[![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fprometheus%2fcommon/v0.50.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/go/github.com%2fprometheus%2fcommon/v0.50.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/go/github.com%2fprometheus%2fcommon/v0.49.0/v0.50.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fprometheus%2fcommon/v0.49.0/v0.50.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [github.com/prometheus/common](https://togithub.com/prometheus/common)
| `v0.48.0` -> `v0.50.0` |
[![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fprometheus%2fcommon/v0.50.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/go/github.com%2fprometheus%2fcommon/v0.50.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/go/github.com%2fprometheus%2fcommon/v0.48.0/v0.50.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fprometheus%2fcommon/v0.48.0/v0.50.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

> [!WARNING]
> Some dependencies could not be looked up. Check the Dependency
Dashboard for more information.

---

### Release Notes

<details>
<summary>prometheus/common (github.com/prometheus/common)</summary>

###
[`v0.50.0`](https://togithub.com/prometheus/common/releases/tag/v0.50.0)

[Compare
Source](https://togithub.com/prometheus/common/compare/v0.49.0...v0.50.0)

#### What's Changed

- Synchronize common files from prometheus/prometheus by
[@&#8203;prombot](https://togithub.com/prombot) in
[prometheus/common#594
- Bump github.com/stretchr/testify from 1.8.4 to 1.9.0 in /sigv4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[prometheus/common#593
- Bump github.com/aws/aws-sdk-go from 1.50.27 to 1.50.29 in /sigv4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[prometheus/common#592
- Bump github.com/aws/aws-sdk-go from 1.50.29 to 1.50.31 in /sigv4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[prometheus/common#595
- Remove unused 'Host' member from HTTPClientConfig by
[@&#8203;bboreham](https://togithub.com/bboreham) in
[prometheus/common#597
- Add OpenMetrics unit support by
[@&#8203;vesari](https://togithub.com/vesari) in
[prometheus/common#544
- Remove deprecated version function by
[@&#8203;SuperQ](https://togithub.com/SuperQ) in
[prometheus/common#591
- Synchronize common files from prometheus/prometheus by
[@&#8203;prombot](https://togithub.com/prombot) in
[prometheus/common#599
- Bump golang.org/x/oauth2 from 0.17.0 to 0.18.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[prometheus/common#600
- Bump google.golang.org/protobuf from 1.32.0 to 1.33.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[prometheus/common#601

**Full Changelog**:
prometheus/common@v0.49.0...v0.50.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "on tuesday" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/open-telemetry/opentelemetry-collector-contrib).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4yMDAuMCIsInVwZGF0ZWRJblZlciI6IjM3LjI0NS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: opentelemetrybot <107717825+opentelemetrybot@users.noreply.github.com>
codeboten pushed a commit to open-telemetry/opentelemetry-collector that referenced this pull request Apr 11, 2024
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [github.com/prometheus/common](https://togithub.com/prometheus/common)
| `v0.48.0` -> `v0.52.3` |
[![age](https://developer.mend.io/api/mc/badges/age/go/github.com%2fprometheus%2fcommon/v0.52.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/go/github.com%2fprometheus%2fcommon/v0.52.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/go/github.com%2fprometheus%2fcommon/v0.48.0/v0.52.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/go/github.com%2fprometheus%2fcommon/v0.48.0/v0.52.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>prometheus/common (github.com/prometheus/common)</summary>

###
[`v0.52.3`](https://togithub.com/prometheus/common/compare/v0.52.2...v0.52.3)

[Compare
Source](https://togithub.com/prometheus/common/compare/v0.52.2...v0.52.3)

###
[`v0.52.2`](https://togithub.com/prometheus/common/releases/tag/v0.52.2)

[Compare
Source](https://togithub.com/prometheus/common/compare/v0.51.1...v0.52.2)

#### What's Changed

- Drop support for Go older than 1.18 by
[@&#8203;SuperQ](https://togithub.com/SuperQ) in
[prometheus/common#612
- fix(protobuf): Correctly decode multi-messages streams by
[@&#8203;srebhan](https://togithub.com/srebhan) in
[prometheus/common#616
- Bump github.com/aws/aws-sdk-go from 1.50.31 to 1.51.11 in /sigv4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[prometheus/common#615

#### New Contributors

- [@&#8203;srebhan](https://togithub.com/srebhan) made their first
contribution in
[prometheus/common#616

**Full Changelog**:
prometheus/common@v0.51.1...v0.52.2

###
[`v0.51.1`](https://togithub.com/prometheus/common/releases/tag/v0.51.1)

[Compare
Source](https://togithub.com/prometheus/common/compare/v0.51.0...v0.51.1)

#### What's Changed

- Synchronize common files from prometheus/prometheus by
[@&#8203;prombot](https://togithub.com/prombot) in
[prometheus/common#606
- Synchronize common files from prometheus/prometheus by
[@&#8203;prombot](https://togithub.com/prombot) in
[prometheus/common#609
- Retract v0.50.0 by [@&#8203;SuperQ](https://togithub.com/SuperQ) in
[prometheus/common#610

**Full Changelog**:
prometheus/common@v0.51.0...v0.51.1

###
[`v0.51.0`](https://togithub.com/prometheus/common/releases/tag/v0.51.0)

[Compare
Source](https://togithub.com/prometheus/common/compare/v0.50.0...v0.51.0)

#### What's Changed

- Synchronize common files from prometheus/prometheus by
[@&#8203;prombot](https://togithub.com/prombot) in
[prometheus/common#604
- expfmt: Add a way to generate different OpenMetrics Formats by
[@&#8203;ywwg](https://togithub.com/ywwg) in
[prometheus/common#596
- Fix string slice definition for FormatFlagOptions. by
[@&#8203;gizmoguy](https://togithub.com/gizmoguy) in
[prometheus/common#607
- Correct logic in sample naming for counters, add new test by
[@&#8203;vesari](https://togithub.com/vesari) in
[prometheus/common#608

#### New Contributors

- [@&#8203;gizmoguy](https://togithub.com/gizmoguy) made their first
contribution in
[prometheus/common#607

**Full Changelog**:
prometheus/common@v0.50.0...v0.51.0

###
[`v0.50.0`](https://togithub.com/prometheus/common/releases/tag/v0.50.0)

[Compare
Source](https://togithub.com/prometheus/common/compare/v0.49.0...v0.50.0)

#### What's Changed

- Synchronize common files from prometheus/prometheus by
[@&#8203;prombot](https://togithub.com/prombot) in
[prometheus/common#594
- Bump github.com/stretchr/testify from 1.8.4 to 1.9.0 in /sigv4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[prometheus/common#593
- Bump github.com/aws/aws-sdk-go from 1.50.27 to 1.50.29 in /sigv4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[prometheus/common#592
- Bump github.com/aws/aws-sdk-go from 1.50.29 to 1.50.31 in /sigv4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[prometheus/common#595
- Remove unused 'Host' member from HTTPClientConfig by
[@&#8203;bboreham](https://togithub.com/bboreham) in
[prometheus/common#597
- Add OpenMetrics unit support by
[@&#8203;vesari](https://togithub.com/vesari) in
[prometheus/common#544
- Remove deprecated version function by
[@&#8203;SuperQ](https://togithub.com/SuperQ) in
[prometheus/common#591
- Synchronize common files from prometheus/prometheus by
[@&#8203;prombot](https://togithub.com/prombot) in
[prometheus/common#599
- Bump golang.org/x/oauth2 from 0.17.0 to 0.18.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[prometheus/common#600
- Bump google.golang.org/protobuf from 1.32.0 to 1.33.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[prometheus/common#601

**Full Changelog**:
prometheus/common@v0.49.0...v0.50.0

###
[`v0.49.0`](https://togithub.com/prometheus/common/releases/tag/v0.49.0)

[Compare
Source](https://togithub.com/prometheus/common/compare/v0.48.0...v0.49.0)

#### What's Changed

- Synchronize common files from prometheus/prometheus by
[@&#8203;prombot](https://togithub.com/prombot) in
[prometheus/common#574
- Bump github.com/aws/aws-sdk-go from 1.49.13 to 1.50.8 in /sigv4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[prometheus/common#571
- Synchronize common files from prometheus/prometheus by
[@&#8203;prombot](https://togithub.com/prombot) in
[prometheus/common#581
- Update Go by [@&#8203;SuperQ](https://togithub.com/SuperQ) in
[prometheus/common#588
- Deprecate version.NewCollector by
[@&#8203;SuperQ](https://togithub.com/SuperQ) in
[prometheus/common#579
- Bump github.com/aws/aws-sdk-go from 1.50.8 to 1.50.27 in /sigv4 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[prometheus/common#587
- Avoid off-spec openmetrics exposition when exemplars have empty labels
by [@&#8203;orls](https://togithub.com/orls) in
[prometheus/common#569
- Bump golang.org/x/oauth2 from 0.16.0 to 0.17.0 by
[@&#8203;dependabot](https://togithub.com/dependabot) in
[prometheus/common#585
- Write created lines when negotiating OpenMetrics by
[@&#8203;ArthurSens](https://togithub.com/ArthurSens) in
[prometheus/common#504
- Upgrade client_model to v.0.6.0 by
[@&#8203;vesari](https://togithub.com/vesari) in
[prometheus/common#589
- http_config: Add host by
[@&#8203;jkroepke](https://togithub.com/jkroepke) in
[prometheus/common#549
- LabelSet: Fix alphabetical sorting for prometheus LabelSet by
[@&#8203;wasim-nihal](https://togithub.com/wasim-nihal) in
[prometheus/common#575
- labelset: optimise String() function by
[@&#8203;bboreham](https://togithub.com/bboreham) in
[prometheus/common#590

#### New Contributors

- [@&#8203;orls](https://togithub.com/orls) made their first
contribution in
[prometheus/common#569
- [@&#8203;vesari](https://togithub.com/vesari) made their first
contribution in
[prometheus/common#589

**Full Changelog**:
prometheus/common@v0.48.0...v0.49.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "on tuesday" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/open-telemetry/opentelemetry-collector).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4yMjAuMiIsInVwZGF0ZWRJblZlciI6IjM3LjI2OS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: opentelemetrybot <107717825+opentelemetrybot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants