From 1bd58dde3152d0241be669b4cb65c7e013188ca0 Mon Sep 17 00:00:00 2001 From: Kian-Meng Ang Date: Sat, 18 Oct 2025 03:53:11 +0800 Subject: [PATCH] Support OTP/28 in CI Also bump actions/checkout, bump rebar3, resolve dialyzer error, and add missing dialyzer specs. --- .github/workflows/test.yml | 44 ++++++++++++++++++++++++++---------- src/telemetry_poller.erl | 8 ++++++- src/telemetry_poller_app.erl | 2 ++ src/telemetry_poller_sup.erl | 2 ++ 4 files changed, 43 insertions(+), 13 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c903724..03c1a45 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -3,43 +3,63 @@ name: Test on: pull_request: branches: - - 'main' + - "main" push: branches: - - 'main' + - "main" jobs: build: - name: Test on OTP ${{ matrix.otp_version }} and ${{ matrix.os }} + name: OTP ${{ matrix.otp_version }} / rebar3 ${{ matrix.rebar3_version }} / ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: matrix: - otp_version: [24, 25, 26, 27] - os: [ubuntu-latest] - env: - OTP_VERSION: ${{ matrix.otp_version }} + include: + - otp_version: "24" + rebar3_version: "3.21.0" + os: ubuntu-latest + - otp_version: "25" + rebar3_version: "3.21.0" + os: ubuntu-latest + - otp_version: "26" + rebar3_version: "3.25.1" + os: ubuntu-latest + - otp_version: "27" + rebar3_version: "3.25.1" + os: ubuntu-latest + - otp_version: "28" + rebar3_version: "3.25.1" + os: ubuntu-latest + steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 + - uses: erlef/setup-beam@v1 with: otp-version: ${{ matrix.otp_version }} - rebar3-version: 3.22.0 + rebar3-version: ${{ matrix.rebar3_version }} + - uses: actions/cache@v4 name: Cache with: path: | _build - key: ${{ runner.os }}-build-${{ matrix.otp_version }}-${{ hashFiles(format('rebar.lock')) }}-1 + key: ${{ runner.os }}-build-${{ matrix.otp_version }}-${{ matrix.rebar3_version }}-${{ hashFiles(format('rebar.lock')) }}-1 restore-keys: | - ${{ runner.os }}-build-${{ matrix.otp_version }}-1- + ${{ runner.os }}-build-${{ matrix.otp_version }}-${{ matrix.rebar3_version }}-1- + - name: Report run: rebar3 report "compile" + - name: Compile run: rebar3 compile + - name: Common Test tests run: rebar3 ct --cover + - name: XRef run: rebar3 xref + - name: Dialyzer run: rebar3 dialyzer - if: ${{ matrix.otp_version == 27 }} + if: ${{ matrix.otp_version == 28 }} diff --git a/src/telemetry_poller.erl b/src/telemetry_poller.erl index 15c813d..6a1d399 100644 --- a/src/telemetry_poller.erl +++ b/src/telemetry_poller.erl @@ -399,6 +399,7 @@ child_spec(Opts) -> start => {telemetry_poller, start_link, [Opts]} }. +-spec parse_args(options()) -> map(). parse_args(Args) -> Measurements = proplists:get_value(measurements, Args, []), Period = proplists:get_value(period, Args, timer:seconds(5)), @@ -469,7 +470,7 @@ parse_measurement(Term) -> make_measurements_and_filter_misbehaving(Measurements) -> [Measurement || Measurement <- Measurements, make_measurement(Measurement) =/= error]. --spec make_measurement(measurement()) -> measurement() | no_return(). +-spec make_measurement(measurement()) -> measurement() | error. make_measurement(Measurement = {M, F, A}) -> try erlang:apply(M, F, A) of _ -> Measurement @@ -482,15 +483,18 @@ make_measurement(Measurement = {M, F, A}) -> end. ?DOC(false). +-spec handle_call(term(), gen_server:from(), state()) -> {reply, term(), state()}. handle_call(get_measurements, _From, State = #{measurements := Measurements}) -> {reply, Measurements, State}; handle_call(_Request, _From, State) -> {reply, ok, State}. ?DOC(false). +-spec handle_cast(term(), state()) -> {noreply, state()}. handle_cast(_Msg, State) -> {noreply, State}. ?DOC(false). +-spec handle_info(term(), state()) -> {noreply, state()}. handle_info(collect, State) -> GoodMeasurements = make_measurements_and_filter_misbehaving(maps:get(measurements, State)), schedule_measurement(maps:get(period, State)), @@ -499,7 +503,9 @@ handle_info(_, State) -> {noreply, State}. ?DOC(false). +-spec terminate(term(), state()) -> ok. terminate(_Reason, _State) -> ok. ?DOC(false). +-spec code_change(term(), state(), term()) -> {ok, state()}. code_change(_OldVsn, State, _Extra) -> {ok, State}. diff --git a/src/telemetry_poller_app.erl b/src/telemetry_poller_app.erl index 2ca1942..a990cd3 100644 --- a/src/telemetry_poller_app.erl +++ b/src/telemetry_poller_app.erl @@ -5,6 +5,7 @@ -export([start/2, stop/1]). +-spec start(application:start_type(), term()) -> {ok, pid()}. start(_StartType, _StartArgs) -> PollerChildSpec = case application:get_env(telemetry_poller, default, []) of @@ -25,5 +26,6 @@ start(_StartType, _StartArgs) -> end, telemetry_poller_sup:start_link(PollerChildSpec). +-spec stop(term()) -> ok. stop(_State) -> ok. diff --git a/src/telemetry_poller_sup.erl b/src/telemetry_poller_sup.erl index 13e1e7b..a599420 100644 --- a/src/telemetry_poller_sup.erl +++ b/src/telemetry_poller_sup.erl @@ -8,9 +8,11 @@ -define(SERVER, ?MODULE). +-spec start_link([supervisor:child_spec()]) -> {ok, pid()}. start_link(PollerChildSpec) -> supervisor:start_link({local, ?SERVER}, ?MODULE, PollerChildSpec). +-spec init([supervisor:child_spec()]) -> {ok, {supervisor:sup_flags(), [supervisor:child_spec()]}}. init(PollerChildSpec) -> SupFlags = #{strategy => one_for_one, intensity => 1,