This looks promising for us to potentially move off of gogo proto without a
performance hit (maybe even an improvement):
https://vitess.io/blog/2021-06-03-a-new-protobuf-generator-for-go/

On Fri 30. Apr 2021 at 00:01, Austin Cawley-Edwards <[email protected]>
wrote:

> Totally on the benchmarking, that would be great!
>
> I've got a work in progress branch here
> <https://github.com/prometheus/prometheus/compare/main...austince:feat/drop-gogo#diff-43227f90be395387b346f5e08e104df4b98cbddf0ad29d11a847172845d1473aR301>,
> but it looks like it will be rather intensive, unfortunately. The main
> issues seem to be:
> * The use of pointers instead of structs, as @Tom Wilkie
> <[email protected]> mentioned before. It looks like the lib likely
> won't change this <https://github.com/golang/protobuf/issues/1225>
> * Finding a replacement for the `gogoproto.nullable` annotation (perhaps 
> envoy's
> validation plugin <https://github.com/envoyproxy/protoc-gen-validate>
> might be just that?)
> * Size() methods are no longer generated
> * Equals() no longer works out of the box, as protos are now not
> comparable <https://github.com/golang/protobuf/issues/531> (and I'm struggling
> to use the recommended tools
> <https://github.com/prometheus/prometheus/commit/7ab41d638535cb5e5d4c2e84f20409629d001422#>
> )
>
> If anyone has pointers/ ideas here, much appreciated!
>
> Bringing this up at the next Cortex community is probably the best way:
>> https://github.com/cortexproject/cortex#community-meetings
>>
>
> Cool, see you there!
>
> On Thu, Apr 29, 2021 at 5:00 AM Tom Wilkie <[email protected]> wrote:
>
>> Sounds good! As this is pretty performance sensitive, I think we'd want
>> to benchmark any changes to this code before we merge it.  Let me know if I
>> can help there..
>>
>> > You mentioned there are others for Cortex @[email protected]?
>>
>> Bringing this up at the next Cortex community is probably the best way:
>> https://github.com/cortexproject/cortex#community-meetings
>>
>> Cheers!
>>
>> Tom
>>
>> On Wed, Apr 28, 2021 at 5:39 PM Austin Cawley-Edwards <
>> [email protected]> wrote:
>>
>>> This surprised me a little, and sounds awesome - but I can't find any
>>>> more information about it.  Does v1.4.0 generate code for the serialisation
>>>> / deserialisation function or still rely on Golang reflection?  Does it
>>>> allow for the neat tricks to get rid of pointers and all the allocations?
>>>> Anything I can read about this would be super useful.
>>>
>>>
>>> Hmm, I'm not sure on all the specifics, but here's what I've found so
>>> far:
>>> * Golang reflection has largely been replaced by the protoreflect
>>> <https://pkg.go.dev/google.golang.org/protobuf/reflect/protoreflect>
>>> package (which *does not *use Golang reflection under the hood)
>>> * SerDe uses the protoreflect package via dedicated modules for
>>> different formats (json
>>> <https://pkg.go.dev/google.golang.org/[email protected]/encoding/protojson>,
>>> text
>>> <https://pkg.go.dev/google.golang.org/[email protected]/encoding/prototext>,
>>> wire
>>> <https://pkg.go.dev/google.golang.org/[email protected]/encoding/protowire>
>>> )
>>> * Not sure about the specific tricks/ if the overuse of pointers +
>>> allocations are still present, but there is now a first-class lib for
>>> creating compiler plugins
>>> <https://pkg.go.dev/google.golang.org/protobuf/compiler/protogen> that
>>> might be what you're looking for? Looks like there are many plugins that
>>> use it already, judging by the imports
>>> <https://pkg.go.dev/google.golang.org/protobuf/compiler/protogen?tab=importedby>
>>>
>>> Off the top of my head, I would think checking in with the Cortex and
>>>> Thanos projects is probably a good idea ...
>>>>
>>>
>>> +1 sounds good! Are there specific people I should ping on this list? Or
>>> open up issues in their repos? You mentioned there are others for Cortex @
>>> [email protected]?
>>>
>>> On Wed, Apr 28, 2021 at 8:05 AM Tom Wilkie <[email protected]> wrote:
>>>
>>>> > Along with that, many of the performance boosts that are provided by
>>>> gogo have been addressed in the official Go lib, golang/protobuf
>>>> <https://github.com/golang/protobuf>, as of v1.4.0
>>>> <https://blog.golang.org/protobuf-apiv2>.
>>>>
>>>> This surprised me a little, and sounds awesome - but I can't find any
>>>> more information about it.  Does v1.4.0 generate code for the serialisation
>>>> / deserialisation function or still rely on Golang reflection?  Does it
>>>> allow for the neat tricks to get rid of pointers and all the allocations?
>>>> Anything I can read about this would be super useful.
>>>>
>>>> > Off the top of my head, I would think checking in with the Cortex and
>>>> Thanos projects is probably a good idea, I know both have a good amount of
>>>> optimizations optimizing allocations, so it would be good to check that
>>>> these would still be possible.
>>>>
>>>> From a Cortex PoV, we have copies of these protos so I don't think this
>>>> would be too much of a problem, but I'd defer to people who know better
>>>> than me.
>>>>
>>>> Cheers
>>>>
>>>> Tom
>>>>
>>>> On Wed, Apr 28, 2021 at 10:07 AM Frederic Branczyk <[email protected]>
>>>> wrote:
>>>>
>>>>> I'd be very happy with this. One consideration that we should take
>>>>> (certainly not blocking this but should keep in mind) is how this would
>>>>> affect immediate downstream users. Off the top of my head, I would think
>>>>> checking in with the Cortex and Thanos projects is probably a good idea, I
>>>>> know both have a good amount of optimizations optimizing allocations, so 
>>>>> it
>>>>> would be good to check that these would still be possible.
>>>>>
>>>>> On Tue, 27 Apr 2021 at 22:51, Austin Cawley-Edwards <
>>>>> [email protected]> wrote:
>>>>>
>>>>>>
>>>>>> Hi all,
>>>>>>
>>>>>> The protobuf library used in Prometheus, gogo/protobuf
>>>>>> <https://github.com/gogo/protobuf>, is no longer actively maintained
>>>>>> (activity largely stopped pre-2020, looking for new ownership
>>>>>> <https://github.com/gogo/protobuf/issues/691>). Along with that,
>>>>>> many of the performance boosts that are provided by gogo have been
>>>>>> addressed in the official Go lib, golang/protobuf
>>>>>> <https://github.com/golang/protobuf>, as of v1.4.0
>>>>>> <https://blog.golang.org/protobuf-apiv2>.
>>>>>>
>>>>>> Many projects that used gogo/protobuf have since switched to the
>>>>>> official lib (ex: Istio <https://github.com/istio/istio/pull/17132>,
>>>>>> Envoyproxy
>>>>>> <https://github.com/envoyproxy/go-control-plane/issues/213>),
>>>>>> largely for eco-system compatibility reasons now that performance is not 
>>>>>> a
>>>>>> factor. The gogo-compiled protobufs are not compatible with any
>>>>>> golang-compiled protobufs, and vice-versa. This makes consuming external
>>>>>> protobuf APIs impossible unless they also maintain a gogo version, which 
>>>>>> is
>>>>>> not common.
>>>>>>
>>>>>> I'm wondering if anyone has done work in this area recently, and if
>>>>>> the community agrees it's a net benefit switching to the official
>>>>>> golang/protobuf implementation.
>>>>>>
>>>>>> *What this would mean for Prometheus*
>>>>>>
>>>>>> Looking at the history of protobuf in Prometheus, it seems like both
>>>>>> golang/protobuf and gogo/protobuf were until the end of 2017, when it 
>>>>>> then
>>>>>> made sense to consolidate onto gogo (#3346
>>>>>> <https://github.com/prometheus/prometheus/issues/3346>) (#3394
>>>>>> <https://github.com/prometheus/prometheus/pull/3394>).
>>>>>>
>>>>>> As noted in the above issues, the official golang/protobuf package is
>>>>>> still present in vendored files, so it is just the Prometheus protos that
>>>>>> would need to be updated. The build procedures (mainly
>>>>>> scripts/genproto.sh
>>>>>> <https://github.com/prometheus/prometheus/blob/75e505babb9bbcefd8849e945814d35c7ce97e9f/scripts/genproto.sh>)
>>>>>> have not changed much since the 2017 shift, so the work would be mainly
>>>>>> adjusting this back to use golang/protobuf and recompiling the `prompb`
>>>>>> package.
>>>>>>
>>>>>> Does anyone know of other necessary changes/ complications that I'm
>>>>>> missing?
>>>>>>
>>>>>> Thanks all for your time,
>>>>>> Austin
>>>>>>
>>>>>> --
>>>>>> You received this message because you are subscribed to the Google
>>>>>> Groups "Prometheus Developers" group.
>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>> send an email to [email protected].
>>>>>> To view this discussion on the web visit
>>>>>> https://groups.google.com/d/msgid/prometheus-developers/38caa51d-e88a-489b-a045-54144cd1a03fn%40googlegroups.com
>>>>>> <https://groups.google.com/d/msgid/prometheus-developers/38caa51d-e88a-489b-a045-54144cd1a03fn%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>> .
>>>>>>
>>>>> --
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "Prometheus Developers" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>>> an email to [email protected].
>>>>> To view this discussion on the web visit
>>>>> https://groups.google.com/d/msgid/prometheus-developers/CAOs1Umy%2BhjN10r9q_MOwZ2wHL-0MEDZWw_2SCUPW%2B%3D8xpKvdQw%40mail.gmail.com
>>>>> <https://groups.google.com/d/msgid/prometheus-developers/CAOs1Umy%2BhjN10r9q_MOwZ2wHL-0MEDZWw_2SCUPW%2B%3D8xpKvdQw%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>> .
>>>>>
>>>>

-- 
You received this message because you are subscribed to the Google Groups 
"Prometheus Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/prometheus-developers/CAOs1Umwjo3KdK1%3DCKvQev%2BO-wyV%3Def9K6wWK6smEtewGS1nRNw%40mail.gmail.com.

Reply via email to