Let's actually see whether my reports are helpful or not, since you ignored at least four out six. I'll focus on one at a time so that we can exactly identify the consequences.

Scenario 1 (it's still in the thread below) are customers who CAN change their command line. But they are inexperienced. There are two responses you can make to these type of customers in that scenario

- either: sorry, you just have to suck it up, your scenario is not our priority. But unhappy as it may make you, at least it's only (hopefully) for your first production issue

- or: hey everyone, you might need to troubleshoot, so run your JVMs with "-XX:-DisableAttachMechanism" option

The former is priortising the preference to stop libraries becoming agents (something that's never actually caused any problems). The latter suggests the default should be to allow agents to attach.

This is very helpful to understand now. There is a specific tradeoff you are choosing.




On 18/05/2023 19:57, Ron Pressler wrote:
Look, we have two goals:

1. Due to the reasons explained in the informational JEP, libraries must not be 
allowed to grant themselves superpowers by means of injecting agents into their 
host application.

2. We’d like to minimise the impact on honest-to-god serviceability tools that 
actually *have* to be started, by a human operator, after the application has 
started running.

Can you see how unhelpful your comments have been in providing information that 
could help us achieve those goals? Representative or otherwise they contain no 
information that will help us achieve those goals. They don’t tell us anything 
about how often people really need to use tools that must inject an agent after 
startup, and they tell us nothing new about the source of related problems. 
It’s like calling the police and saying: I’m reporting that there’s crime. 
There’s nothing there to either act or even to update statistics. It’s not a 
report, it’s a declaration.

These mailing lists are not how we gather knowledge about the ecosystem. 
They're where we ask experts and interested parties for feedback that sometimes 
includes things we may have overlooked. If you’d like to help us achieve the 
goals above, consider what kind of useful information or even leads you can 
provide.

— Ron

On 18 May 2023, at 18:13, Jack Shirazi <ja...@fasterj.com> wrote:

I have repeatedly suggested, on the original jdk-dev thread, that this needs to 
be taken to a wider audience. Each time that request was ignored. These email 
lists are niche, and are popuated by subscribers who are interested in 
technical development of the JVM, which is entirely the wrong audience to ask 
for the reports you have asked for. I am not even a member of either of these 
(jigsaw-dev and serviceability-dev), I was pulled in by your request for this 
specific thread.

The only thing I can do here is provide reports as requested - which I have, 
with well known real world developments. So asking for these reports from the 
readers of these niche lists is unhelpful if you seriously want to examine the 
hurdles that this JEP will result in if it goes on to apply the flipped 
default. I have represented these absent customers to the best of my ability, 
and if we keep the discussion here, I will maintain that these reports need to 
addressed as representative.

I would be delighted to drop this thread and have the JEP discussed in wider 
forums, so extensive feedback can be gained, as I said I have advocated exactly 
that from the start.


On 18/05/2023 17:31, Ron Pressler wrote:
First, you will need to accept that no one is as invested in the user 
experience of the Java ecosystem as a whole as much as OpenJDK’s maintainers, 
and no one is as incentivised to work toward its continued success. If you 
don’t believe it, you will still need to accept it axiomatically if you wish to 
participate in constructive discussions on the OpenJDK mailing lists.

Now, nothing can impact Java’s direction more than user reports about problems 
they’re experiencing. We then talk to them try to understand the core of the 
problem and try to fix it at the right place. What you’ve done is not reported 
a problem but said that you know of others that may experience problems for 
unspecified reasons. That is not what we mean by user reports, and I hope you 
can see how unhelpful it is from the perspective of product management. If we 
don’t know why people do things, there is simply no way for us to address the 
issues they experience. Similarly, when asked for reports about common uses for 
dynamically attached agents (that cannot be loaded at startup), saying “there 
are people who need to dynamically attach an agent” is also unhelpful. We are 
obviously aware that the need is not zero, and such a statement doesn’t help us 
in any way asses the frequency or severity of the issue.

Given that people who cannot control the command line and yet wish to deploy 
the most sophisticated Java applications on the newest releases are in for a 
world of pain regardless of this JEP, you can help us help them by getting them 
to talk to us and explain their experience. We very much want to help them, but 
we cannot solve a problem if we don’t know what it is.

— Ron

On 18 May 2023, at 16:49, Jack Shirazi <ja...@fasterj.com> wrote:

You asked for reports of common uses of dynamically loaded agents for serviceability and 
difficulties setting a flag. I have provided several. You have ignored most of the 
examples, and categorized the remainder as "incorrect uses of Java" (by which I 
assume you mean incorrect uses of JVMs), as if you are the judge of what is correct and 
incorrect rather than business priorities.

As a sponsor of the JEP you have a built-in incentive to simply ignore and 
dismiss objections, and I'm seeing that applied here. That's not really 
acceptable. I'm sure you have the technical ability to proceed to force through 
an unpopular JEP while ignoring objections. That seems unwise, but that's up to 
you


On 18/05/2023 16:27, Ron Pressler wrote:
It is simply untenable to accommodate many incorrect uses of Java on top of the 
correct ones, and, for example, allowing the dynamic loading of agents but 
disallowing loading them at startup is an incorrect use of Java. The solution 
to people using Java incorrectly is to educate them — which this JEP will 
hopefully help do — not to punish those who use Java correctly.

Similarly, given the number of command line options that are added in each 
release, those who feel they have a need to choose what subset of them they 
allow, must be committed to review and amend their allowed options for each 
release.

Those who actually do the kind of things mentioned in the two previous 
paragraphs are invited to discuss them with us. But while I understand that you 
are personally particularly interested in agents, the people I mentioned in the 
previous two paragraphs will have been affected by other JEPs more than by this 
one, so I think this JEP is too small and too niche to discuss the importance 
that the command line has had for Java applications in the last five years. 
Maybe when the informational JEP is accepted it could serve as a basis for 
discussion/user education.

— Ron

On 18 May 2023, at 15:30, Jack Shirazi <ja...@fasterj.com> wrote:

That's a strange analysis, two out of the six examples of well known real world 
applications, systems and platforms has that claim. And these are well known. 
I'm not sure where most of your comments come from, but let me assume this 
isn't just a blanket dismissal because you're the JEP sponsor and so 
incentivized to do that.

- All the scenarios are well known real world ones. If you don't know about 
them, ask the community.

- The business processing platforms, as I said "can only configure the application 
and any JVM parameters that have been explicitly exported by the 3rd party" do 
indeed allow the heap size to adjusted, because they explicitly make that parameter 
configurable - in the application properties. That's pretty common. Most startup scripts 
for most JVM applications out there choose a set of JVM parameters that are independently 
configurable via properties/variables/options without explictly setting the JVM 
command-line. That's the most common way to start JVMs! I'm not making the claim that all 
these can't change the command line, just explaining how some specific chosen parameters 
can be set but not the whole command line, as you don't seem to be aware of that very 
common practice. So yes, this is not only viable but common. The 
applications/systems/platforms that restrict access to changing the startup scripts are a 
subset. They do so for their own reasons.

- I fail to see how a new release matters here. The business model is what 
drives this, not your assumptions.

- You seem to have mis-categorized all the scenarios as being of one type, 
which they most certainly are not.


On 16/05/2023 18:22, Ron Pressler wrote:
At the core of your arguments is the claim — that we’ve heard told second-hand 
but rarely if ever reported first-hand — that the inability to control the 
command line is common. This claim is very important because its implications 
go well beyond the relatively niche issue of dynamically loaded agents, so I 
think it merits further discussion4. Certainly since the discontinuation of the 
centralised JRE deployment model in JDK 11, it’s been a deep assumption of 
Java’s design that deploying a Java application requires control of the command 
line. If you cannot control the command line, there are things you simply 
cannot do, including much more basic things than loading agents. If your 
application needs APM, surely it also needs control over the heap and GC with 
potentially new options.

Those who restrict access to the command line will need to explain their 
constraints because that approach is already not viable. Deploying a Java 
application, certainly one that supports super-advanced uses such as the 
dynamic loading of agents for code manipulation, without control of the command 
line is not a model that the platform has supported for a while. Java’s 
deployment model changed some years ago, and policies that applied to the 
retired model do not apply for the new one and have to change (again, nothing 
to do with agents).

Since we’re talking about changes that only take place in new releases anyway, 
I find the notion that adding a command line flag is harder than adopting a new 
runtime version to be somewhat suspect, but if there’s a good reason for that, 
someone will need to present it.

A service vendor that wishes to allow a Java program to use a new runtime and 
to create a child process that injects a native library into the parent process 
will need to explain why they cannot also allow that program to set command 
line flags. If you want to support JDK 11 and upward to enjoy new features and 
performance enhancements, you need to also support the changes to the 
deployment model that accompany these new developments.

— Ron

On 16 May 2023, at 13:36, Jack Shirazi <ja...@fasterj.com> wrote:

Here I refer to anyone who is operating the JVM as a customer. Scenarios where 
this JEP will (when moved from deprecation to fully applied) onerously 
adversely impact customers include:

1. Most obviously, those customers who have running JVMs, decide they want to 
add an observability agent, but are unaware of the DisableAttachMechanism JVM 
option - most operators are unaware of the majority of JVM options. These 
customers would only be able to add observability agents after
1a. investigating why the attach is failing
1b. resetting their command-line
1c. waiting until they can restart
These customers would normally be able to immediately gain APM data, and 
troubleshoot an existing running JVM when it has a problem, by attaching an 
agent. The requirement to reset the command-line would mean that future 
invocations would be observable and can use an agent for troubleshooting, but 
often the choice to apply a troubleshooting agent is their first encounter with 
agent technology - in other words the first time they need it, they can't use 
it. It's hardly ideal to insist that only sophisticated or experienced 
customers can use agent troubleshooting technologies

2. Many customers have a long process between proposing command-line changes 
and allowing them to be applied in production (including changes via 
environment variables). Allowing an agent to be attached provides immediate 
capability until that process is complete. The same long process means there is 
no prospect of switching on remote agent attachment without that same process 
being followed. These customers currently accept agent attachment before the 
changes have been passed as the technology is proven, robust and typically they 
use an agent from a vendor that guarantees (and with support contract) that it 
is valid to attach the agent to a production JVM

3. There are types of customers who run 3rd party JVM applications that they 
configure - but they can only configure the application and any JVM parameters 
that have been explicitly exported by the 3rd party. (This is very common for 
bought-in business processing applications). Changes to the JVM command-line 
are rarely allowed in this scenario (it violates the contract). Typically if 
the customer wants a change they make an enhancement request and even where 
these are prioritized, they often have to pay more for the changes so they are 
reluctant to make requests that are not directly business enhancing. Currently 
these types of customers can attach APM agents with no issue, providing 
excellent observability in to the request flow in the system to identify 
problems. These customers will be disadvantaged

4. In complete opposition to the whole thrust of the JEP, I've seen customers 
who will not allow agents attached via the command-line but will allow them if 
started by a Java library. Go figure. It's not logical but that's our industry 
for you. This is the case for several managed platforms (where the developer 
does not have direct access to JVM environment variables and arguments), and 
also where the person in charge of the deployment delegates the responsibility 
of agents to the dev team, who need to do this programmatically. Perhaps these 
customers/platforms will accept adding the flipped option to the command-line, 
perhaps not or perhaps only after finding that they now have an agent 
attachment issue - in any case it imposes additional process to something that 
works well at the moment

5. Injecting agents to containers running JVMs is a minefield. Attachment via a 
script after startup is often easier. Changing the command-line involves 
setting the JAVA_TOOL_OPTIONS environment variable before starting the 
container, but if the container already uses that variable then the conflict 
usually causes loss of one or the other setting, so it doesn't work in that 
case.

6. For k8s, using JAVA_TOOL_OPTIONS is currently the preferred mechanism (eg 
via mutating webhooks) and works well so this JEP shouldn't matter. But there 
are cases where that doesn't work (eg per container conflicts as above; or 
where security roles restrict this; etc) and in those the only alternative is 
to attach to the pod and attach the agent . This would require rebuilding 
images (either with the -XX:-DisableAttachMechanism option or with 
-javaagent/agentlib). Of course the observability community will attempt to 
pre-empt the problem by telling everyone to build their images with 
-XX:-DisableAttachMechanism - but that already points to the JEP being an 
anti-pattern


On 12/05/2023 19:28, Ron Pressler wrote:
(Moving to the appropriate mailing lists for the discussion of this JEP)

We want reports of common uses of dynamically loaded agents for serviceability 
and difficulties setting a flag. Our judgment will sway if we learn that the 
use of dynamically loaded agents for serviceability is very common and that 
setting a command line flag is onerous. Such reports of “I use dynamically 
loaded agents for X and it’s hard for me to set a flag because Y” should be 
made here, i.e. jigsaw-...@openjdk.org, serviceability-dev@openjdk.org.

Saying “I don’t like this (because I can think of cases where it may 
inconvenience me a little)” is not a report of a problem. A JDK feature that is 
disliked by only 1% of users will still be disliked by tens of thousands of 
people, and pretty much every JDK feature or lack of a feature is disliked by 
some Java developers; some features even inconvenience some minority of users. 
By physical necessity we sometimes inconvenience some users  because users have 
contradictory requirements. What we’re trying to estimate is just *how much* of 
an inconvenience will be caused by feature X or the lack of X when integrated 
over the entire ecosystem.

  — Ron

On 12 May 2023, at 12:37, Jack Shirazi <ja...@fasterj.com> wrote:

Thanks, this is going in circles. You want reports, I'm fine with that, I will 
provide a report. But my one report is not going to be sufficient to move your 
judgement. So I'll ask once again where should further such reports go, and at 
what point does your judgement sway?


On 12/05/2023 16:46, Ron Pressler wrote:
Let’s start with you describing the particular use-cases of dynamically loaded 
agents that you’re concerned about and why you think a command-line flag to 
enable the functionality is onerous. In other words, describe the nature and 
severity of a *problem*. Remember that the goal of JDK maintainers is to serve 
the ecosystem as a whole, which means accommodating the conflicting desires by 
different classes of users. Because different people’s requirements are 
sometimes in contradiction with one another, we need to make a judgment. As JEP 
451 says, this judgment is based on the assumptions that: 1. The need for 
dynamically loaded agent is not very common, and 2. When needed, adding a flag 
is not onerous.

Stating you don’t like a policy that’s been discussed for roughly a decade and 
started to be put into effect five years ago is not enough. However, if you 
have questions regarding the informational JEP that attempts to summarise past 
discussions (https://openjdk.org/jeps/8305968) I’ll gladly try and answer them.

— Ron

On 12 May 2023, at 10:05, Jack Shirazi <ja...@fasterj.com> wrote:


Integrity must be opt out, and cannot be opt in, and so opting in is not a 
solution that will give us integrity*by default*. 
Seehttps://openjdk.org/jeps/8305968#Strong-Encapsulation-by-Default
This is an opinion, not a statement of fact. It needs to be justified, not 
assumed. Integrity is a goal, and there is a balance between what is useful and 
what can be limited. For full integrity, don't use the JVM at all. I for one 
prefer to continue using it.

The only information of relevance would be reports showing that dynamically 
loading agents are a commonly-needed functionality and that adding a 
command-line option to allow it is onerous.
I'm fine with that. I'm reporting exactly that here. I encourage others 
interested in this to also report that. I'll mention it in my next newsletter - 
where do you want the reports sent? My readers won't want to signup to this 
email list just to send a comment. At what point does the reporting mean the 
JEP is dropped?


On 12/05/2023 14:44, Ron Pressler wrote:
On 12 May 2023, at 05:26, Jack Shirazi <ja...@fasterj.com> wrote:

Thank  you for your reply. This makes it clear that the JEP has a single 
specific tradeoff. So we have two capabilities at issue here

A) Currently libraries can turn themselves into agents

B) Currently agents can remotely attach

The JEP has decided for the community that each of these are a bad thing and 
should be disabled by default (though enableable by setting an option).
No, the JEP says:

"To assure integrity, we need stronger measures to prevent the misuse by 
libraries of dynamically loaded agents. Unfortunately, we have not found a simple 
and automatic way to distinguish between a serviceability tool that dynamically 
loads an agent and a library that dynamically loads an agent.”

The only problem is libraries, but because there’s no simple way to distinguish 
between the two, and because dynamically loaded agents are not needed in most 
serviceability uses, disabling them by default is reasonable. BTW, this was 
already decided in 2017 in JEP 261: https://openjdk.org/jeps/261

As the JEP also says, in the future we may be able to distinguish between tools 
and libraries via a more complex mechanism that could allow tools to load 
agents dynamically without the flag.


My involvement in community discussions over the years has been that no one 
complains about (A), it has not been used maliciously, and there is a small 
niche who use it. (B) is used quite a lot and enhances JVM serviceability with 
a capability that is a clear advantage over other runtimes. It seems a shame to 
eliminate that competitive advantage.
Malicious use is not a concern *at all*. What this JEP addresses is integrity 
by default. See https://openjdk.org/jeps/8305968

The JEP clearly points out that anyone concerned by these can disable the 
ability with a simple command-line option, so there is a simple solution for 
this minority.
Integrity must be opt out, and cannot be opt in, and so opting in is not a 
solution that will give us integrity *by default*. See 
https://openjdk.org/jeps/8305968#Strong-Encapsulation-by-Default


The fundamental error is really that the attaching agent is read-write rather 
than read-only. If we could change that, it would be ideal, but sadly I don't 
think that's easily doable.
Perhaps, but most uses of dynamically loaded agents (and nearly all uses of 
dynamically loaded *Java* agents) are for “write.” The most common use-case for 
“read-only” is dynamically attached advanced profilers that use JVM TI. The 
solution there, as the JEP says, is not to separate agent capabilities but to 
improve JFR’s capabilities — which do not require an agent at all — and JFR can 
obtain profiles far more efficiently than anything JVM TI could ever hope to 
achieve.

I and many in the monitoring community believe this JEP is NOT an enhancement 
to the JDK. The proposers believe it is. Is there a mechanism other than this 
email discussion list to gain wider community feedback so we can ascertain if 
there is really a strong community preference either way?

The only information of relevance would be reports showing that dynamically 
loading agents are a commonly-needed functionality and that adding a 
command-line option to allow it is onerous.

— Ron

Reply via email to