adapter

package
v0.38.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 15, 2023 License: Apache-2.0 Imports: 49 Imported by: 327

Documentation

Overview

Copyright 2020 The Knative 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.

Index

Constants

View Source
const (
	EnvConfigComponent            = "K_COMPONENT"
	EnvConfigNamespace            = "NAMESPACE"
	EnvConfigName                 = "NAME"
	EnvConfigResourceGroup        = "K_RESOURCE_GROUP"
	EnvConfigSink                 = "K_SINK"
	EnvConfigCACert               = "K_CA_CERTS"
	EnvConfigCEOverrides          = "K_CE_OVERRIDES"
	EnvConfigMetricsConfig        = "K_METRICS_CONFIG"
	EnvConfigLoggingConfig        = "K_LOGGING_CONFIG"
	EnvConfigTracingConfig        = "K_TRACING_CONFIG"
	EnvConfigLeaderElectionConfig = "K_LEADER_ELECTION_CONFIG"
	EnvSinkTimeout                = "K_SINK_TIMEOUT"
)

Variables

This section is empty.

Functions

func ConfigWatcherFromContext added in v0.31.0

func ConfigWatcherFromContext(ctx context.Context) configmap.Watcher

ConfigWatcherFromContext retrieves a ConfigMap Watcher from the context.

func ContextWithMetricTag

func ContextWithMetricTag(ctx context.Context, metric *MetricTag) context.Context

ContextWithMetricTag returns a copy of parent context in which the value associated with metric key is the supplied metric tag.

func GetConfigMapByPolling added in v0.31.0

func GetConfigMapByPolling(ctx context.Context, name string) (cm *corev1.ConfigMap, err error)

GetConfigMapByPolling retrieves a ConfigMap. If an error other than NotFound is returned, the operation will be repeated each second up to 5 seconds. These timeout and retry interval are set by heuristics. e.g. istio sidecar needs a few seconds to configure the pod network.

The context is expected to be initialized with injection and namespace.

func GetSinkTimeout added in v0.18.1

func GetSinkTimeout(logger *zap.SugaredLogger) int

func IsConfigWatcherEnabled added in v0.31.0

func IsConfigWatcherEnabled(ctx context.Context) bool

IsConfigWatcherEnabled indicates whether the ConfigMapWatcher is required or not.

func IsHAEnabled added in v0.17.0

func IsHAEnabled(ctx context.Context) bool

IsHAEnabled checks the context for the desire to enable leader elector.

func IsInjectorEnabled added in v0.17.0

func IsInjectorEnabled(ctx context.Context) bool

IsInjectorEnabled checks the context for the desire to enable injectors TODO: deprecated.

func LeaderElectionComponentConfigToJSON added in v0.19.0

func LeaderElectionComponentConfigToJSON(cfg *kle.ComponentConfig) (string, error)

LeaderElectionComponentConfigToJSON converts a ComponentConfig to a json string.

func Main

func Main(component string, ector EnvConfigConstructor, ctor AdapterConstructor)

func MainMessageAdapter added in v0.15.0

func MainMessageAdapter(component string, ector EnvConfigConstructor, ctor MessageAdapterConstructor)

func MainMessageAdapterWithContext added in v0.15.0

func MainMessageAdapterWithContext(ctx context.Context, component string, ector EnvConfigConstructor, ctor MessageAdapterConstructor)

func MainWithContext

func MainWithContext(ctx context.Context, component string, ector EnvConfigConstructor, ctor AdapterConstructor)

func MainWithEnv added in v0.17.0

func MainWithEnv(ctx context.Context, component string, env EnvConfigAccessor, ctor AdapterConstructor)

func MainWithInformers added in v0.17.0

func MainWithInformers(ctx context.Context, component string, env EnvConfigAccessor, ctor AdapterConstructor)

func NamespaceFromContext added in v0.31.0

func NamespaceFromContext(ctx context.Context) string

NamespaceFromContext gets the working namespace from the context

func SecretFetcher added in v0.31.0

func SecretFetcher(ctx context.Context) metrics.SecretFetcher

SecretFetcher provides a helper function to fetch individual Kubernetes Secrets (for example, a key for client-side TLS). Note that this is not intended for high-volume usage; the current use is when establishing a metrics client connection in WatchObservabilityConfigOrDie. This method requires that the Namespace has been added to the context.

func SetupConfigMapWatch added in v0.31.0

func SetupConfigMapWatch(ctx context.Context, opts ...ConfigMapWatchOption) configmap.Watcher

SetupConfigMapWatch establishes a watch on a namespace's configmaps.

func SetupInformers added in v0.17.0

func SetupInformers(ctx context.Context, logger *zap.SugaredLogger) (context.Context, []controller.Informer)

func SetupLoggerFromConfig added in v0.31.0

func SetupLoggerFromConfig(config *logging.Config, component string) (*zap.SugaredLogger, zap.AtomicLevel)

SetupLoggerFromConfig sets up the logger using the provided config and returns a logger and atomic level, or dies by calling log.Fatalf.

func StartInformers added in v0.17.0

func StartInformers(ctx context.Context, informers []controller.Informer)

func WithConfigWatcher added in v0.31.0

func WithConfigWatcher(ctx context.Context, cmw configmap.Watcher) context.Context

WithConfigWatcher adds a ConfigMap Watcher informer to the context.

func WithConfigWatcherEnabled added in v0.31.0

func WithConfigWatcherEnabled(ctx context.Context) context.Context

WithConfigWatcherEnabled flags the ConfigMapWatcher to be configured.

func WithConfiguratorOptions added in v0.31.0

func WithConfiguratorOptions(ctx context.Context, opts []ConfiguratorOption) context.Context

WithConfiguratorOptions sets custom options on the adapter configurator.

func WithController added in v0.18.0

func WithController(ctx context.Context, ctor ControllerConstructor) context.Context

WithController signals to MainWithContext that it should create and configure a controller notifying the adapter when a resource is ready and removed

func WithHAEnabled added in v0.17.0

func WithHAEnabled(ctx context.Context) context.Context

WithHAEnabled signals to MainWithContext that it should set up an appropriate leader elector for this component.

func WithInjectorEnabled added in v0.17.0

func WithInjectorEnabled(ctx context.Context) context.Context

WithInjectorEnabled signals to MainWithInjectors that it should try to run injectors. TODO: deprecated. Use WithController instead

func WithNamespace added in v0.31.0

func WithNamespace(ctx context.Context, namespace string) context.Context

WithNamespace defines the working namespace for the adapter.

Types

type Adapter

type Adapter interface {
	Start(ctx context.Context) error
}

Adapter is the interface receive adapters are expected to implement

type AdapterConfigurator added in v0.31.0

AdapterConfigurator exposes methods for configuring the adapter.

type AdapterConstructor

type AdapterConstructor func(ctx context.Context, env EnvConfigAccessor, client cloudevents.Client) Adapter

type Client added in v0.38.0

type Client interface {
	cloudevents.Client
	// contains filtered or unexported methods
}

func NewClient added in v0.38.0

func NewClient(cfg ClientConfig) (Client, error)

func NewClientHTTPObserved added in v0.29.0

func NewClientHTTPObserved(topt []http.Option, copt []ceclient.Option) (Client, error)

func NewCloudEventsClient

func NewCloudEventsClient(target string, ceOverrides *duckv1.CloudEventOverrides, reporter source.StatsReporter) (Client, error)

NewCloudEventsClient returns a client that will apply the ceOverrides to outbound events and report outbound event counts.

func NewCloudEventsClientCRStatus added in v0.17.0

func NewCloudEventsClientCRStatus(env EnvConfigAccessor, reporter source.StatsReporter, crStatusEventClient *crstatusevent.CRStatusEventClient) (Client, error)

NewCloudEventsClientCRStatus returns a client CR status

func NewCloudEventsClientWithOptions added in v0.24.0

func NewCloudEventsClientWithOptions(ceOverrides *duckv1.CloudEventOverrides, reporter source.StatsReporter, opts ...http.Option) (Client, error)

NewCloudEventsClientWithOptions returns a client created with provided options

type ClientConfig added in v0.38.0

type ClientConfig struct {
	Env                 EnvConfigAccessor
	CeOverrides         *duckv1.CloudEventOverrides
	Reporter            source.StatsReporter
	CrStatusEventClient *crstatusevent.CRStatusEventClient
	Options             []http.Option
}

func GetClientConfig added in v0.38.0

func GetClientConfig(ctx context.Context) ClientConfig

type CloudEventsStatusReporterConfigurator added in v0.31.0

type CloudEventsStatusReporterConfigurator interface {
	CreateCloudEventsStatusReporter(ctx context.Context) *crstatusevent.CRStatusEventClient
}

CloudEventsStatusReporterConfigurator configures the CloudEvents client reporting settings for an adapter.

func NewCloudEventsReporterConfiguratorFromConfigMap added in v0.31.0

func NewCloudEventsReporterConfiguratorFromConfigMap(opts ...CloudEventsStatusReporterConfiguratorFromConfigMapOption) CloudEventsStatusReporterConfigurator

NewCloudEventsReporterConfiguratorFromConfigMap returns a ConfigMap based CloudEvents status reporter configurator.

func NewCloudEventsStatusReporterConfiguratorFromEnvironment added in v0.31.0

func NewCloudEventsStatusReporterConfiguratorFromEnvironment(env EnvConfigAccessor) CloudEventsStatusReporterConfigurator

NewCloudEventsStatusReporterConfiguratorFromEnvironment returns an environment based CloudEvents status reporter configurator.

type CloudEventsStatusReporterConfiguratorFromConfigMapOption added in v0.31.0

type CloudEventsStatusReporterConfiguratorFromConfigMapOption func(*cloudEventsStatusReporterConfiguratorFromConfigMap)

CloudEventsStatusReporterConfiguratorFromConfigMapOption for teawking the CloudEvents status reporter configurator.

func WithCloudEventsStatusReporterConfiguratorConfigMapName added in v0.31.0

func WithCloudEventsStatusReporterConfiguratorConfigMapName(name string) CloudEventsStatusReporterConfiguratorFromConfigMapOption

WithCloudEventsStatusReporterConfiguratorConfigMapName sets the ConfigMap name for the CloudEvents status reporter configuration.

type ConfigMapWatchOption added in v0.31.0

type ConfigMapWatchOption func(*ConfigMapWatchOptions)

ConfigMapWatchOption modifies setup for a ConfigMap informer.

func ConfigMapWatchWithLabels added in v0.31.0

func ConfigMapWatchWithLabels(ls []labels.Requirement) ConfigMapWatchOption

ConfigMapWatchWithLabels sets the labels filter to be configured at the ConfigMap watcher informer.

type ConfigMapWatchOptions added in v0.31.0

type ConfigMapWatchOptions struct {
	LabelsFilter []labels.Requirement
}

ConfigMapWatchOptions are the options that can be set for the ConfigMapWatch informer.

type ConfiguratorOption added in v0.31.0

type ConfiguratorOption func(*adapterConfigurator)

ConfiguratorOption enables customizing the adapter configuration.

func ConfiguratorOptionsFromContext added in v0.31.0

func ConfiguratorOptionsFromContext(ctx context.Context) []ConfiguratorOption

ConfiguratorOptionsFromContext retrieves adapter configurator options.

func WithCloudEventsStatusReporterConfigurator added in v0.31.0

func WithCloudEventsStatusReporterConfigurator(c CloudEventsStatusReporterConfigurator) ConfiguratorOption

WithCloudEventsStatusReporterConfigurator sets the adapter configurator with a CloudEvents status reporter option.

func WithLoggerConfigurator added in v0.31.0

func WithLoggerConfigurator(c LoggerConfigurator) ConfiguratorOption

WithLoggerConfigurator sets the adapter configurator with a custom logger option.

func WithMetricsExporterConfigurator added in v0.31.0

func WithMetricsExporterConfigurator(c MetricsExporterConfigurator) ConfiguratorOption

WithMetricsExporterConfigurator sets the adapter configurator with a custom metrics exporter option.

func WithProfilerConfigurator added in v0.31.0

func WithProfilerConfigurator(c ProfilerConfigurator) ConfiguratorOption

WithProfilerConfigurator sets the adapter configurator with a custom profiler option.

func WithTracingConfigurator added in v0.31.0

func WithTracingConfigurator(c TracingConfigurator) ConfiguratorOption

WithTracingConfigurator sets the adapter configurator with a custom tracing option.

type ControllerConstructor added in v0.18.0

type ControllerConstructor func(ctx context.Context, adapter Adapter) *controller.Impl

ControllerConstructor is the function signature for creating controllers synchronizing the multi-tenant receive adapter state

func ControllerFromContext added in v0.18.0

func ControllerFromContext(ctx context.Context) ControllerConstructor

ControllerFromContext gets the controller constructor from the context

type EnvConfig

type EnvConfig struct {
	// Component is the kind of this adapter.
	Component string `envconfig:"K_COMPONENT"`

	// Environment variable containing the namespace of the adapter.
	Namespace string `envconfig:"NAMESPACE"`

	// Environment variable containing the name of the adapter.
	Name string `envconfig:"NAME" default:"adapter"`

	// Environment variable containing the resource group of the adapter for metrics.
	ResourceGroup string `envconfig:"K_RESOURCE_GROUP" default:"adapter.sources.knative.dev"`

	// Sink is the URI messages will be sent.
	Sink string `envconfig:"K_SINK"`

	// CACerts are the Certification Authority (CA) certificates in PEM format
	// according to https://www.rfc-editor.org/rfc/rfc7468.
	// +optional
	CACerts *string `envconfig:"K_CA_CERTS"`

	// CEOverrides are the CloudEvents overrides to be applied to the outbound event.
	CEOverrides string `envconfig:"K_CE_OVERRIDES"`

	// MetricsConfigJson is a json string of metrics.ExporterOptions.
	// This is used to configure the metrics exporter options,
	// the config is stored in a config map inside the controllers
	// namespace and copied here.
	MetricsConfigJson string `envconfig:"K_METRICS_CONFIG" default:"{}"`

	// LoggingConfigJson is a json string of logging.Config.
	// This is used to configure the logging config, the config is stored in
	// a config map inside the controllers namespace and copied here.
	LoggingConfigJson string `envconfig:"K_LOGGING_CONFIG" default:"{}"`

	// TracingConfigJson is a json string of tracing.Config.
	// This is used to configure the tracing config, the config is stored in
	// a config map inside the controllers namespace and copied here.
	// Default is no-op.
	TracingConfigJson string `envconfig:"K_TRACING_CONFIG"`

	// LeaderElectionConfigJson is the leader election component configuration.
	LeaderElectionConfigJson string `envconfig:"K_LEADER_ELECTION_CONFIG"`

	// Time in seconds to wait for sink to respond
	EnvSinkTimeout string `envconfig:"K_SINK_TIMEOUT"`
	// contains filtered or unexported fields
}

EnvConfig is the minimal set of configuration parameters source adapters should support.

func (*EnvConfig) GetCACerts added in v0.37.0

func (e *EnvConfig) GetCACerts() *string

func (*EnvConfig) GetCloudEventOverrides

func (e *EnvConfig) GetCloudEventOverrides() (*duckv1.CloudEventOverrides, error)

func (*EnvConfig) GetLeaderElectionConfig added in v0.16.0

func (e *EnvConfig) GetLeaderElectionConfig() (*kle.ComponentConfig, error)

func (*EnvConfig) GetLogger

func (e *EnvConfig) GetLogger() *zap.SugaredLogger

func (*EnvConfig) GetMetricsConfig

func (e *EnvConfig) GetMetricsConfig() (*metrics.ExporterOptions, error)

func (*EnvConfig) GetName

func (e *EnvConfig) GetName() string

func (*EnvConfig) GetNamespace

func (e *EnvConfig) GetNamespace() string

func (*EnvConfig) GetSink

func (e *EnvConfig) GetSink() string

func (*EnvConfig) GetSinktimeout added in v0.18.1

func (e *EnvConfig) GetSinktimeout() int

func (*EnvConfig) SetComponent

func (e *EnvConfig) SetComponent(component string)

func (*EnvConfig) SetupTracing added in v0.15.0

func (e *EnvConfig) SetupTracing(logger *zap.SugaredLogger) (tracing.Tracer, error)

type EnvConfigAccessor

type EnvConfigAccessor interface {
	// Set the component name.
	SetComponent(string)

	// Get the URI where messages will be forwarded to.
	GetSink() string

	// GetCACerts gets the CACerts of the Sink.
	GetCACerts() *string

	// Get the namespace of the adapter.
	GetNamespace() string

	// Get the name of the adapter.
	GetName() string

	// Get the parsed metrics.ExporterOptions.
	GetMetricsConfig() (*metrics.ExporterOptions, error)

	// Get the parsed logger.
	GetLogger() *zap.SugaredLogger

	SetupTracing(*zap.SugaredLogger) (tracing.Tracer, error)

	GetCloudEventOverrides() (*duckv1.CloudEventOverrides, error)

	// GetLeaderElectionConfig returns leader election configuration.
	GetLeaderElectionConfig() (*kle.ComponentConfig, error)

	// Get the timeout to apply on a request to a sink
	GetSinktimeout() int
}

EnvConfigAccessor defines accessors for the minimal set of source adapter configuration parameters.

func ConstructEnvOrDie added in v0.17.0

func ConstructEnvOrDie(ector EnvConfigConstructor) EnvConfigAccessor

type EnvConfigConstructor

type EnvConfigConstructor func() EnvConfigAccessor

type LoggerConfigurator added in v0.31.0

type LoggerConfigurator interface {
	CreateLogger(ctx context.Context) *zap.SugaredLogger
}

LoggerConfigurator configures the logger for an adapter.

func NewLoggerConfiguratorFromConfigMap added in v0.31.0

func NewLoggerConfiguratorFromConfigMap(component string, opts ...LoggerConfiguratorFromConfigMapOption) LoggerConfigurator

NewLoggerConfiguratorFromConfigMap returns a ConfigMap based logger configurator.

func NewLoggerConfiguratorFromEnvironment added in v0.31.0

func NewLoggerConfiguratorFromEnvironment(env EnvConfigAccessor) LoggerConfigurator

NewLoggerConfiguratorFromEnvironment returns an environment based logger configurator.

type LoggerConfiguratorFromConfigMapOption added in v0.31.0

type LoggerConfiguratorFromConfigMapOption func(*loggerConfiguratorFromConfigMap)

LoggerConfiguratorFromConfigMapOption for teawking the logger configurator.

func WithLoggerConfiguratorConfigMapName added in v0.31.0

func WithLoggerConfiguratorConfigMapName(name string) LoggerConfiguratorFromConfigMapOption

WithLoggerConfiguratorConfigMapName sets the ConfigMap name for the logger configuration.

type MessageAdapter added in v0.15.0

type MessageAdapter interface {
	Start(ctx context.Context) error
}

type MessageAdapterConstructor added in v0.15.0

type MessageAdapterConstructor func(ctx context.Context, env EnvConfigAccessor, sink duckv1.Addressable, reporter source.StatsReporter) MessageAdapter

type MetricTag

type MetricTag struct {
	Name          string
	Namespace     string
	ResourceGroup string
}

MetricTag context

func MetricTagFromContext

func MetricTagFromContext(ctx context.Context) *MetricTag

MetricTagFromContext returns the metric tag stored in context. Returns nil if no metric tag is set in context, or if the stored value is not of correct type.

type MetricsExporterConfigurator added in v0.31.0

type MetricsExporterConfigurator interface {
	SetupMetricsExporter(ctx context.Context)
}

MetricsExporterConfigurator configures the metrics exporter for an adapter.

func NewMetricsExporterConfiguratorFromConfigMap added in v0.31.0

func NewMetricsExporterConfiguratorFromConfigMap(component string, opts ...MetricsExporterConfiguratorFromConfigMapOption) MetricsExporterConfigurator

NewMetricsExporterConfiguratorFromConfigMap returns a ConfigMap based metrics exporter configurator.

func NewMetricsExporterConfiguratorFromEnvironment added in v0.31.0

func NewMetricsExporterConfiguratorFromEnvironment(env EnvConfigAccessor) MetricsExporterConfigurator

NewMetricsExporterConfiguratorFromEnvironment returns an environment based metrics exporter configurator.

type MetricsExporterConfiguratorFromConfigMapOption added in v0.31.0

type MetricsExporterConfiguratorFromConfigMapOption func(*metricsExporterConfiguratorFromConfigMap)

MetricsExporterConfiguratorFromConfigMapOption for teawking the metrics exporter configurator.

func WithMetricsExporterConfiguratorConfigMapName added in v0.31.0

func WithMetricsExporterConfiguratorConfigMapName(name string) MetricsExporterConfiguratorFromConfigMapOption

WithMetricsExporterConfiguratorConfigMapName sets the ConfigMap name for the metrics exporter configuration.

func WithMetricsExporterConfiguratorMetricsDomain added in v0.31.0

func WithMetricsExporterConfiguratorMetricsDomain(domain string) MetricsExporterConfiguratorFromConfigMapOption

WithMetricsExporterConfiguratorMetricsDomain sets the metrics domain for the metrics exporter configuration.

func WithMetricsExporterConfiguratorMetricsPort added in v0.34.6

func WithMetricsExporterConfiguratorMetricsPort(port int) MetricsExporterConfiguratorFromConfigMapOption

WithMetricsExporterConfiguratorMetricsPort sets the metrics exporter port for the metrics exporter configuration.

type ObservabilityConfigurator added in v0.31.0

type ObservabilityConfigurator interface {
	LoggerConfigurator
	MetricsExporterConfigurator
	TracingConfigurator
}

ObservabilityConfigurator groups the observability related methods that configure an adapter.

type ProfilerConfigurator added in v0.31.0

type ProfilerConfigurator interface {
	CreateProfilingServer(ctx context.Context) *http.Server
}

ProfilerConfigurator configures the profiling settings for an adapter.

func NewProfilerConfiguratorFromConfigMap added in v0.31.0

func NewProfilerConfiguratorFromConfigMap(opts ...ProfilerConfiguratorFromConfigMapOption) ProfilerConfigurator

NewProfilerConfiguratorFromConfigMap returns a ConfigMap based profiler configurator.

func NewProfilerConfiguratorFromEnvironment added in v0.31.0

func NewProfilerConfiguratorFromEnvironment(env EnvConfigAccessor) ProfilerConfigurator

NewProfilerConfiguratorFromEnvironment returns an environment based profiler configurator.

type ProfilerConfiguratorFromConfigMapOption added in v0.31.0

type ProfilerConfiguratorFromConfigMapOption func(*profilerConfiguratorFromConfigMap)

ProfilerConfiguratorFromConfigMapOption for teawking the profiler configurator.

func WithProfilerConfiguratorConfigMapName added in v0.31.0

func WithProfilerConfiguratorConfigMapName(name string) ProfilerConfiguratorFromConfigMapOption

WithProfilerConfiguratorConfigMapName sets the ConfigMap name for the profiler configuration.

type TracingConfiguration added in v0.31.0

type TracingConfiguration struct {
	InstanceName string
}

TracingConfiguration for adapters.

type TracingConfigurator added in v0.31.0

type TracingConfigurator interface {
	SetupTracing(ctx context.Context, cfg *TracingConfiguration) tracing.Tracer
}

TracingConfigurator configures the tracing settings for an adapter.

func NewTracingConfiguratorFromConfigMap added in v0.31.0

func NewTracingConfiguratorFromConfigMap(opts ...TracingConfiguratorFromConfigMapOption) TracingConfigurator

NewTracingConfiguratorFromConfigMap returns a ConfigMap based tracing configurator.

func NewTracingConfiguratorFromEnvironment added in v0.31.0

func NewTracingConfiguratorFromEnvironment(env EnvConfigAccessor) TracingConfigurator

NewTracingConfiguratorFromEnvironment returns an environment based tracing configurator.

type TracingConfiguratorFromConfigMapOption added in v0.31.0

type TracingConfiguratorFromConfigMapOption func(*tracingConfiguratorFromConfigMap)

TracingConfiguratorFromConfigMapOption for teawking the tracing configurator.

func WithTracingConfiguratorConfigMapName added in v0.31.0

func WithTracingConfiguratorConfigMapName(name string) TracingConfiguratorFromConfigMapOption

WithTracingConfiguratorConfigMapName sets the ConfigMap name for the tracing configuration.

Directories

Path Synopsis
util

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL