#
# 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)"
        - "Showcase (apache/skywalking-showcase)"
    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!"
