#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.
#

name: SkyWalking Bug report
title: "[Bug] "
description: Problems and issues with code of Apache SkyWalking
labels: [ "bug" ]
body:
  - type: markdown
    attributes:
      value: |
        <img src="https://skywalking.apache.org/assets/logo.svg" alt="SkyWalking logo" height="90px" align="right" />

        Thank you for finding the time to report the problem! We really appreciate the community efforts to improve SkyWalking.

        Please make sure what you are reporting is indeed a bug with reproducible steps, if you want to ask questions
        or share ideas, please [subscribe to our mailing list](mailto:dev-subscribe@skywalking.apache.org) and sent
        emails to [our mailing list](mailto:dev@skywalking.apache.org), you can also head to our
        [Discussion](https://github.com/apache/skywalking/discussions) tab.

  - type: checkboxes
    attributes:
      label: Search before asking
      description: >
        Please make sure to search in the [issues](https://github.com/apache/skywalking/issues?q=is%3Aissue) first to see
        whether the same issue was reported already.
      options:
        - label: >
            I had searched in the [issues](https://github.com/apache/skywalking/issues?q=is%3Aissue) and found no similar
            issues.
          required: true

  - type: dropdown
    attributes:
      label: Apache SkyWalking Component
      description: |
        What Apache SkyWalking component are you using? Apache SkyWalking has many subprojects, please make sure
        to choose the component that you found the bug. For non-Apache community projects, please refer to their
        corresponding repos.
      multiple: false
      options:
        - "OAP server (apache/skywalking)"
        - "UI (apache/skywalking-rocketbot-ui)"
        - "Java Agent (apache/skywalking-java)"
        - "Python Agent (apache/skywalking-python)"
        - "NodeJS Server Side Agent (apache/skywalking-nodejs)"
        - "NodeJS Client Side Agent (apache/skywalking-client-js)"
        - "Nginx Lua Agent (apache/skywalking-nginx-lua)"
        - "Kong Agent (apache/skywalking-kong)"
        - "Satellite (apache/skywalking-satellite)"
        - "CLI (apache/skywalking-cli)"
        - "Helm Chart (apache/skywalking-kubernetes)"
        - "SWCK (apache/skywalking-swck)"
        - "License Tools (apache/skywalking-eyes)"
        - "Infra E2E (apache/skywalking-infra-e2e)"
        - "BanyanDB (apache/skywalking-banyandb)"
        - "Agent Test Tool (apache/skywalking-agent-test-tool)"
    validations:
      required: true

  - type: textarea
    attributes:
      label: What happened
      description: Describe what happened.
      placeholder: >
        Please provide the context in which the problem occurred and explain what happened
    validations:
      required: true

  - type: textarea
    attributes:
      label: What you expected to happen
      description: What do you think went wrong?
      placeholder: >
        Please explain why you think the behaviour is erroneous. It is extremely helpful if you copy and paste
        the fragment of logs showing the exact error messages or wrong behaviour and screenshots for
        UI problems. You can include files by dragging and dropping them here.

        **NOTE**: please copy and paste texts instead of taking screenshots of them for easy future search.
    validations:
      required: true

  - type: textarea
    attributes:
      label: How to reproduce
      description: >
        What should we do to reproduce the problem? If you are not able to provide a reproducible case,
        please open a [Discussion](https://github.com/apache/skywalking/discussions) instead.
      placeholder: >
        Please make sure you provide a reproducible step-by-step case of how to reproduce the problem
        as minimally and precisely as possible. Keep in mind we do not have access to your deployment.
        Remember that non-reproducible issues will be closed! Opening a discussion is recommended as a
        first step.
    validations:
      required: true

  - type: textarea
    attributes:
      label: Anything else
      description: Anything else we need to know?
      placeholder: >
        How often does this problem occur? (Once? Every time? Only when certain conditions are met?)
        Any relevant logs to include? Put them here inside fenced
        ``` ``` blocks or inside a collapsable details tag if it's too long:
        <details><summary>x.log</summary> lots of stuff </details>

  - type: checkboxes
    attributes:
      label: Are you willing to submit PR?
      description: >
        This is absolutely not required, but we are happy to guide you in the contribution process
        especially if you already have a good understanding of how to implement the fix.
        SkyWalking is a totally community-driven project and we love to bring new contributors in.
        Find us in #skywalking on Slack!
      options:
        - label: Yes I am willing to submit a PR!

  - type: checkboxes
    attributes:
      label: Code of Conduct
      description: The Code of Conduct helps create a safe space for everyone. We require that everyone agrees to it.
      options:
        - label: >
            I agree to follow this project's
            [Code of Conduct](https://www.apache.org/foundation/policies/conduct)
          required: true

  - type: markdown
    attributes:
      value: "Thanks for completing our form!"
