123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- /*
- * Copyright 2022 gRPC 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 orca implements Open Request Cost Aggregation, which is an open
- // standard for request cost aggregation and reporting by backends and the
- // corresponding aggregation of such reports by L7 load balancers (such as
- // Envoy) on the data plane. In a proxyless world with gRPC enabled
- // applications, aggregation of such reports will be done by the gRPC client.
- //
- // # Experimental
- //
- // Notice: All APIs is this package are EXPERIMENTAL and may be changed or
- // removed in a later release.
- package orca
- import (
- "google.golang.org/grpc/grpclog"
- "google.golang.org/grpc/internal/balancerload"
- "google.golang.org/grpc/metadata"
- "google.golang.org/grpc/orca/internal"
- )
- var logger = grpclog.Component("orca-backend-metrics")
- // loadParser implements the Parser interface defined in `internal/balancerload`
- // package. This interface is used by the client stream to parse load reports
- // sent by the server in trailer metadata. The parsed loads are then sent to
- // balancers via balancer.DoneInfo.
- //
- // The grpc package cannot directly call toLoadReport() as that would cause an
- // import cycle. Hence this roundabout method is used.
- type loadParser struct{}
- func (loadParser) Parse(md metadata.MD) interface{} {
- lr, err := internal.ToLoadReport(md)
- if err != nil {
- logger.Infof("Parse failed: %v", err)
- }
- if lr == nil && logger.V(2) {
- logger.Infof("Missing ORCA load report data")
- }
- return lr
- }
- func init() {
- balancerload.SetParser(loadParser{})
- }
|