# Copyright The OpenTelemetry 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.


from typing import Final

from opentelemetry.metrics import Counter, Histogram, Meter

FAAS_COLDSTARTS: Final = "faas.coldstarts"
"""
Number of invocation cold starts
Instrument: counter
Unit: {coldstart}
"""


def create_faas_coldstarts(meter: Meter) -> Counter:
    """Number of invocation cold starts"""
    return meter.create_counter(
        name=FAAS_COLDSTARTS,
        description="Number of invocation cold starts.",
        unit="{coldstart}",
    )


FAAS_CPU_USAGE: Final = "faas.cpu_usage"
"""
Distribution of CPU usage per invocation
Instrument: histogram
Unit: s
"""


def create_faas_cpu_usage(meter: Meter) -> Histogram:
    """Distribution of CPU usage per invocation"""
    return meter.create_histogram(
        name=FAAS_CPU_USAGE,
        description="Distribution of CPU usage per invocation.",
        unit="s",
    )


FAAS_ERRORS: Final = "faas.errors"
"""
Number of invocation errors
Instrument: counter
Unit: {error}
"""


def create_faas_errors(meter: Meter) -> Counter:
    """Number of invocation errors"""
    return meter.create_counter(
        name=FAAS_ERRORS,
        description="Number of invocation errors.",
        unit="{error}",
    )


FAAS_INIT_DURATION: Final = "faas.init_duration"
"""
Measures the duration of the function's initialization, such as a cold start
Instrument: histogram
Unit: s
"""


def create_faas_init_duration(meter: Meter) -> Histogram:
    """Measures the duration of the function's initialization, such as a cold start"""
    return meter.create_histogram(
        name=FAAS_INIT_DURATION,
        description="Measures the duration of the function's initialization, such as a cold start.",
        unit="s",
    )


FAAS_INVOCATIONS: Final = "faas.invocations"
"""
Number of successful invocations
Instrument: counter
Unit: {invocation}
"""


def create_faas_invocations(meter: Meter) -> Counter:
    """Number of successful invocations"""
    return meter.create_counter(
        name=FAAS_INVOCATIONS,
        description="Number of successful invocations.",
        unit="{invocation}",
    )


FAAS_INVOKE_DURATION: Final = "faas.invoke_duration"
"""
Measures the duration of the function's logic execution
Instrument: histogram
Unit: s
"""


def create_faas_invoke_duration(meter: Meter) -> Histogram:
    """Measures the duration of the function's logic execution"""
    return meter.create_histogram(
        name=FAAS_INVOKE_DURATION,
        description="Measures the duration of the function's logic execution.",
        unit="s",
    )


FAAS_MEM_USAGE: Final = "faas.mem_usage"
"""
Distribution of max memory usage per invocation
Instrument: histogram
Unit: By
"""


def create_faas_mem_usage(meter: Meter) -> Histogram:
    """Distribution of max memory usage per invocation"""
    return meter.create_histogram(
        name=FAAS_MEM_USAGE,
        description="Distribution of max memory usage per invocation.",
        unit="By",
    )


FAAS_NET_IO: Final = "faas.net_io"
"""
Distribution of net I/O usage per invocation
Instrument: histogram
Unit: By
"""


def create_faas_net_io(meter: Meter) -> Histogram:
    """Distribution of net I/O usage per invocation"""
    return meter.create_histogram(
        name=FAAS_NET_IO,
        description="Distribution of net I/O usage per invocation.",
        unit="By",
    )


FAAS_TIMEOUTS: Final = "faas.timeouts"
"""
Number of invocation timeouts
Instrument: counter
Unit: {timeout}
"""


def create_faas_timeouts(meter: Meter) -> Counter:
    """Number of invocation timeouts"""
    return meter.create_counter(
        name=FAAS_TIMEOUTS,
        description="Number of invocation timeouts.",
        unit="{timeout}",
    )
