runtime/observability
Understanding the observability module in the Goten runtime.
Directory runtime contains various libraries linked during compilation. Many more complex cases will be discussed throughout this guide, here is rather a quick recap of some common/simpler ones.
It is rather tiny, and mostly defines interface GotenMessage
, which just
merges fmt.Stringer
and proto.Message
interfaces. Any message generated
by protoc-gen-goten-go implements this interface. We could use it to
figure out who generated the interface.
For resources and many objects, but excluding requests/responses, Goten generates additional helper types. This directory contains interfaces for them. Also, for each proto message that has those helper types, Goten generates implementation as described in the interface GotenObjectExt.
FieldPath
Describes some path valid within the associated object.
FieldMask
Set of FieldPath objects, all valid for the same object.
FieldPathValue
Combination of FieldPath and valid underlying value.
FieldPathArrayOfValues
Combination of FieldPath and valid list of underlying values.
FieldPathArrayItemValue
Combination of FieldPath describing slice and a valid underlying item value.
This directory Contains multiple interfaces related to resource objects.
The most important interface is Resource
, which is implemented by every
proto message with Goten resource annotation, see file resource.go
. The
next most important probably is Descriptor
, as defined in the
descriptor.go
file. You can access proto descriptor using
ProtoReflect().Descriptor()
call on any proto message, this descriptor
contains additional functionality for resources.
Then, you have plenty of helper interfaces like Name, Reference, Filter, OrderBy, Cursor, and PagerQuery.
In the access.go
file you have an interface that can be implemented by
a store or API client by using proper wrappers.
Note that resources have a global registry.
It contains important descriptors: For methods, API groups, and the whole service, but within a version. It has some narrow cases, for example in observability components, where we get request/response objects, and we need to use descriptors to get something useful.
More often we use service descriptors, mostly for convenience for finding methods or more often, iterating resource descriptors.
It contains a global registry for these descriptors.
This Directory is connected with access
packages in generated services,
but it is relatively poor because those packages are pretty much
code-generated. It has mostly interfaces for watcher-related components.
It has however powerful registry component. If you have a connection to
the service (just grpc.ClientConnInterface
) and a descriptor of
the resource, you can construct basic API Access (CRUD) or a high-level
Watcher component (or lower-level QueryWatcher). See the
runtime/access/registry.go
file for the actual implementation.
Note that this global registry needs to be populated, though. When any
specific access package is imported (I mean,
<service>/access/<version>/<resource>
), inside the init function calls
this global registry and stores constructors.
This is the reason we have so many “dummy” imports, just to invoke init functions, so some generic modules can create access objects they need.
This contains a set of common functions/types used by CLI tools, like cuttle.
This directory is worth mentioning for its proto utility functions, like:
GetFieldTypeForOneOf
From the given proto message, can be empty, dummy, extract the actual reflection type under the specified oneof paths. Not an interface, but the final path. Normally it takes some effort to get it…
GetValueFromProtoPath
From given proto object and path, extracts single current value. It takes into account all Goten specific types, including in oneofs. If the last item is an array, it returns the array as a single object.
GetValuesFromProtoPath
Like GetValueFromProtoPath, but returns multiple values, if the field path points to a single object, it is a one-element array. If the field path points to some array, then it contains an array of those values. If the last field path item is NOT an array, but some middle field path item is an array, it will return all values, making this more powerful than GetValueFromProtoPath.
SetFieldPathValueToProtoMsg
It sets value to a proto message under a given path. It allocates all the paths in the middle if sub-objects are missing, and resets oneofs on the path.
SetFieldValueToProtoMsg
It sets a value to a specified field by the descriptor.
Understanding the observability module in the Goten runtime.