Git Product home page Git Product logo

Comments (9)

ccchenhe avatar ccchenhe commented on June 30, 2024 1

I think seems after 389 version, api "ui/api/stats" of health check became an internal api (meaning login is required).
so maybe necessary to modify code of http request in order to get login token.
here is just login demo:

public static String getTrinoClusterToken(String targetUrl, MonitorConfiguration monitorConfiguration){
        HttpURLConnection loginConnection = null;
        try{
            URL loginUrl = new URL(String.format("%s/ui/login", targetUrl));
            loginConnection = (HttpURLConnection) loginUrl.openConnection();
            loginConnection.setRequestMethod("POST");
            loginConnection.setDoOutput(true);
            loginConnection.setInstanceFollowRedirects(false);
            loginConnection.addRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            loginConnection.setRequestProperty("charset", "utf-8");
            String password = "";
            if(!Strings.isNullOrEmpty(monitorConfiguration.getMonitorPassword())){
                password = monitorConfiguration.getMonitorPassword();
            }
            String loginData = String.format("username=%s&password=%s", monitorConfiguration.getMonitorUser(), password);
            byte[] postData = loginData.getBytes( StandardCharsets.UTF_8);
            loginConnection.connect();
            DataOutputStream out = new DataOutputStream(loginConnection.getOutputStream());
            out.write(postData);
            String token = loginConnection.getHeaderField("Set-Cookie");
            out.close();
            // data simple: Trino-UI-Token=xx;Version=1;Path=/ui;HttpOnly
            // so we need split by ;
            return token.split(";")[0];

        }catch (Exception e){
            log.error("Error login trino cluster from {},reason is:  {}", targetUrl, e);
        }finally {
            if (loginConnection != null) {
                loginConnection.disconnect();
            }
        }
        return "";
    }

after obtain login token, change healthy check http request code:

public static String requestTrinoClusterStatsWithToken(String targetUrl, String token){
        HttpURLConnection apiConnection = null;
        try{
            URL apiURL = new URL(String.format("%s/ui/api/stats", targetUrl));
            apiConnection = (HttpURLConnection) apiURL.openConnection();
            apiConnection.setRequestMethod("GET");
            apiConnection.setRequestProperty("Cookie", token);
            int responseCode = apiConnection.getResponseCode();
            if (responseCode == HttpStatus.SC_OK) {
                BufferedReader reader = new BufferedReader(new InputStreamReader((InputStream) apiConnection.getContent()));
                StringBuilder sb = new StringBuilder();
                String line;
                while ((line = reader.readLine()) != null) {
                    sb.append(line).append("\n");
                }
                return sb.toString();
            }
        }catch (Exception e){
            log.error("Error fetching cluster stats from [{}]", targetUrl, e);
        }finally {
            if (apiConnection != null){
                apiConnection.disconnect();
            }
        }
        return null;
    }

and healthy check logic works.

from presto-gateway.

ccchenhe avatar ccchenhe commented on June 30, 2024 1

but if you just want to confirm that cluster is healthy. maybe only change url from "/ui/api/stats" to "/v1/status"

from presto-gateway.

connorlwilkes avatar connorlwilkes commented on June 30, 2024

This seems like something that should be supported, would be good for someone to validate this behavior if possible

from presto-gateway.

willmostly avatar willmostly commented on June 30, 2024

I've added an option to my fork to query system.runtime.nodes and system.runtime.queries via JDBC with JWT authn instead of using the /ui/api/stats endpoint. In my case we require OAuth for the WebUI, so the gateway can't use any /ui/api endpoints.

I'm happy to contribute back if it is of general interest.

from presto-gateway.

Felicity-3786 avatar Felicity-3786 commented on June 30, 2024

Trying to leverage ActiveClusterMonitor and met the same problem, I was thinking if only for health check purpose v1/status or v1/info/state should be enough, but if we want to get /ui/api/stats to work requires adding a certificate? Happy to discuss more.

from presto-gateway.

ahackett avatar ahackett commented on June 30, 2024

Hi @willmostly

Thanks for the info, and for offering to make you contributions available. This would definitely be of interest to me, and I suspect others in the community are using JWT auth too...

Austin

from presto-gateway.

Chaho12 avatar Chaho12 commented on June 30, 2024

Just a heads up @ccchenhe @ahackett, this issue has been fixed and uses /ui/api/stats for jdbc/http in trinodb/trino-gateway trinodb/trino-gateway@11b2dd2#diff-a3a976d789379cd160fbc2e9281073d96aa6e682e9d9e9ab67883992acaeeab2

For http and jdbc it uses username/pwd set in backendStateConfiguration

from presto-gateway.

Bigbarry7549 avatar Bigbarry7549 commented on June 30, 2024

uhuh

from presto-gateway.

Bigbarry7549 avatar Bigbarry7549 commented on June 30, 2024

boobs

from presto-gateway.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.